簡體   English   中英

O2中的gcc優化標志導致未定義符號

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

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