[英]gcc optimization flags in O2 that causes undefined symbol
我在gcc 4.5.2中遇到-O2問題。 說我有這段代碼:
//file.cpp
void test::f() {}
//file.h
struct test
{
inline void f();
};
此代碼在共享庫中。 現在,當我不使用-O2進行編譯時,它可以正常工作。 使用-O2表示test :: f()是未定義的符號。 顯然,gcc只是將其丟棄,因為它是“內聯”的(盡管實際上不是)。
我的問題是什么特定的優化標志導致了此? 我的想法是我想啟用-O2但禁用該確切標志,以便使內聯保持不變(這不是我的代碼)。
我可能只可以迭代所有對象,但這也可以是鏈接器標志,對嗎? 這是太多的工作,我只是希望有人能有所作為。
該標准要求在使用inline
函數的每個TU中都應包含inline
函數的定義。
要么刪除inline
要么將函數的定義移至頭文件。 即使允許您要執行的操作,將函數標記為inline
也沒有任何好處。
碰巧的是,在您的實現中,您遇到了-O2
問題,但如果沒有它,顯然沒有問題。
最好的解決方案是修復或拒絕損壞的代碼。 內聯函數必須在使用它們的任何翻譯單元中定義,並且此代碼違反了該規則。
如果不是這種選擇,那么-fkeep-inline-functions
可能會很好地解決問題,以允許代碼進行編譯和鏈接。
您可以使用-fno-inline
標志強制gcc
忽略inline
-fno-inline
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.