簡體   English   中英

GCC優化在運行時產生“未定義的符號”

[英]GCC Optimization results in “Undefined symbol” at runtime

我現在有一個讓我感到困惑的問題:我有一些用C ++編寫的軟件,它鏈接到C中的庫。我使用通常的頭文件類

extern "C" {
    #include <libheader.h>
}

只要我不使用gcc的優化,一切正常。 一旦我打開偶數-O1,即第一個優化級別,在運行期間我得到一個來自該庫的符號的“未定義符號”錯誤。 但是,該名稱已經過了名稱修改,應該禁用extern "C"

如果這很重要,則會內聯調用有問題符號的函數。 使用的編譯器是gcc 4.4.3。

老實說,我甚至不知道要搜索什么,所以如果你們中的一個人能給我一些這種行為的理由,我將非常感激。

感謝您的支持。

你說你將libheader.h文件包含在extern "C"塊中,但是鏈接器正在尋找的符號已被命名為。

就是這樣的指示libheader.h也被包括在外部的extern "C"塊(包括內部extern "C"塊可能是由於包括在警衛NOP libheader.h )。

尋找可能包含libheader.h其他方法。 GCC的-E和/或各種-M選項可能對此有幫助,也可能沒有幫助。 或者(如果僅用於測試)移動libheader.hextern "C"塊:

// at start of libheader.h:
#ifdef __cplusplus
extern "C" {
#endif

/* existing contents of libheader.h */
// ...

// at end of libheader.h:
#ifdef __cplusplus
}
#endif

請注意,鏈接規范可以嵌​​套,因此您不必刪除#include站點上現有的extern "C"塊。

我不知道為什么問題只會發生在優化的構建中,除了包含調用函數的非內聯版本的.c或.cpp文件可能使頭部正確,並且只需要一個翻譯單元得到標題錯誤並內聯調用函數以查看問題。

如果你有一個在沒有內聯時定義但在內聯時沒有定義的函數,那么定義問題應該非常簡單。

您已經在某處使用了該函數,但未包含其頭文件。

查看調用此函數的所有文件,並確保包含標頭。

是否有可能定義調用內聯函數的頭包含沒有 extern "C"包裝的庫的頭,以及其他地方使用包裝行?

你有沒有試過像-O2這樣的其他關卡?

你嘗試過功能嗎?

extern "C" {...}包裝C頭並不總是有效; 通常,標題需要設計為使用兩種語言才能使用這兩種語言。

在這種情況下,沒有更多細節,很難確切地說出發生了什么, inline關鍵字在C和C ++中意味着不同的東西; 我不希望帶有inline函數的標題以這種方式工作。 (手邊,我不會指望你得到的症狀,但他們也不會特別讓我感到驚訝。)

處理這個問題的正確方法是堅持圖書館的供應商提供一個設計用於兩種語言的標題。

如果做不到這一點,處理這個問題的正確方法是編寫自己的C代碼,其中包含標題並包裝您需要的所有函數,並為此C代碼編寫自己的標題,該代碼旨在包含在兩種語言中。 我承認,這是很多工作; 讓供應商完成他的工作,而不是為他做一半。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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