-1

次のテストプログラムを作成しました

int proc1();
extern int globalvar;

int func1 ()
{
    return globalvar + 1;
}

int func2()
{
    return proc1()+3;
}

int main()
{
    return 0;
}

ご覧のとおり、このプログラムは何もしていません。ただし、コンパイル中に、これらがエントリポイント関数から参照されないという事実にもかかわらず、globalvarおよびのリンカーエラーに直面しました。Windows(を使用)とLinux(を使用)の両方で問題に直面しました。int proc1()mainclgcc

この参照されていないグローバル変数と関数をエントリ ポイント (cl、gcc、clang) からリンクしないようにコンパイラ/リンカーに指示する方法はありますか?

Windows での正確なエラー メッセージ:

test.obj : error LNK2019: unresolved external symbol "int globalvar" (?globalvar@@3HA) referenced in function "int __cdecl func1(void)" (?func1@@YAHXZ)
test.obj : error LNK2019: unresolved external symbol "int __cdecl proc1(void)" (?proc1@@YAHXZ) referenced in function "int __cdecl func2(void)" (?func2@@YAHXZ)
test.exe : fatal error LNK1120: 2 unresolved externals
4

1 に答える 1

1

gccこれは、で次のように修正できます。

gcc -ffunction-sections -Wl,--gc-sections test.c

これにより、次の 2 つのことが行われます。

  1. これは、バイナリ ファイル内の独自の「セクション」に各関数を出力するようにコンパイラに指示します。

  2. 参照されていないセクションを破棄 (ガベージ コレクション) するようリンカに指示します。

これは、func1andが破棄されることを意味するため、 orfunc2への参照はこれ以上ありません。globalvarproc1

于 2014-07-03T11:37:49.750 に答える