簡體   English   中英

gcc 4.4與gcc> 4.4中的默認鏈接模型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM