[英]Default linkage model in gcc 4.4 vs. gcc >4.4
我正在嘗試使用兩個大型復雜的線性代數庫來定義許多相同的函數。 我無法重寫(在一個案例中合法,但在技術上都在兩者中)。 讓我們稱它們為“特殊”和“正常”,因為我只調用特殊的幾個函數。 要始終如一地調用normal.h
定義的函數,並且僅在某些情況下來自special.h
,我做了類似這樣的事情:
namespace special_space
{
#include "special.h" // Defines foo()
}
#include "normal.h" // Defines foo()
int main() {
foo(); // Calls foo() defined in normal.h
special_space::foo(); // Calls foo() defined in special.h
}
使用g ++ - 4.4,這是我開發它的默認設置,代碼編譯和鏈接沒有警告,它按照我的預期和我想要的方式執行。 這似乎在各種平台,各種Linux,Unix和BSD環境中是一致的。 但! 如果我使用g ++> 4.4進行編譯,我會收到有關多個foo()
定義的警告:
在文件special.h :: line:col:warning中:使用C語言鏈接聲明'void special_space :: foo()'[默認啟用]
生成的可執行文件然后在調用special_space::foo()
。 我/認為/在special.h中找到的定義中指定extern "C++"
可能會解決這個問題,但是我不允許更改special.h。 所以我該怎么做? 進一步來說:
1)使用g ++ - 4.4是否安全? 如果是這樣 - 后續版本有什么變化,為什么?
2)如果指定C ++鏈接模型真的會解決這個問題,有沒有辦法告訴ld默認使用它?
3)如果這兩者都沒有 - 是否有另一種方法從定義同名函數的庫中調用函數?
因此,當我在評論中發布時,包括標題包括
#ifdef __cplusplus
extern "C" {
#endif
#include normal.h
#ifdef __cplusplus
}
#endif
用兩個標題執行此操作。
基本上,既然你要鏈接來自c ++的c庫,它確實名稱為mangling(這是允許重載的),你對c lib中符號的調用就被鏈接器破壞了。 #ifdef __cplusplus
告訴鏈接器不要#ifdef __cplusplus
那些特定功能符號的名稱。
理想情況下,庫的創建者應在其標題中包含此內容,但您提到您無法控制它。 我對一些生成的代碼有類似的問題。 我必須將我生成的代碼包含在此包含生成的代碼,以允許C ++調用它。
我不知道的是,如果沒有這個,它是如何運作的。 我肯定要回到gcc <4.4。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.