2

gcc 4.5.2 の -O2 に問題があります。このコードがあるとします:

//file.cpp
void test::f() {}
//file.h
struct test
{
    inline void f();
};

このコードは共有ライブラリにあります。これで、-O2 なしでコンパイルすると、問題なく動作します。-O2 を指定すると、test::f() は未定義のシンボルであることがわかります。明らかに、「インライン」であるため、gcc はそれを破棄します (実際にはそうではありません)。

私の質問は、これを引き起こす特定の最適化フラグは何ですか? アイデアは、-O2 を有効にしたいが、その正確なフラグを無効にして、インラインをそのままにしておくことができるようにすることです (それは私のコードではありません)。

私はおそらくそれらすべてを反復することができますが、これはリンカーフラグでもありますよね? これは大変な作業です。誰かが手掛かりを持っていることを願っています。

4

3 に答える 3

6

標準では、inline関数の定義が、それを使用するすべての TU に存在する必要があります。

関数の定義を削除するinlineか、ヘッダー ファイルに移動します。やりたいことが許されても、関数をマークするメリットはありませんinline

たまたま実装に問題がありますが、-O2それがなくても明らかに問題はありません。

于 2012-11-30T12:35:00.727 に答える
2

最善の解決策は、破損したコードを修正または拒否することです。インライン関数は、それらを使用する翻訳単位で定義する必要があり、このコードはその規則を破っています。

それができない場合は-fkeep-inline-functions、コードをコンパイルしてリンクできるように、問題に十分なパッチを当てることができます。

于 2012-11-30T12:40:55.083 に答える
0

flag を使用して強制的gccに無視することができます。inline-fno-inline

于 2012-11-30T12:31:09.380 に答える