Я написал следующую тестовую программу
int proc1();
extern int globalvar;
int func1 ()
{
return globalvar + 1;
}
int func2()
{
return proc1()+3;
}
int main()
{
return 0;
}
Как видите, эта программа ничего не делает. Однако при компиляции я столкнулся с ошибкой компоновщика globalvar
а также int proc1()
несмотря на то, что на них не будут ссылаться из функции точки входа main
,
Я столкнулся с проблемой на обеих Windows (используя cl
) и Linux (используя gcc
).
Есть ли способ дать указание компилятору / компоновщику не связывать эту глобальную переменную и функцию, на которые нет ссылок, с точки входа (на 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
Вы можете это исправить, в gcc
, как это:
gcc -ffunction-sections -Wl,--gc-sections test.c
Это делает две вещи:
Он указывает компилятору выдавать каждую функцию в своем собственном «разделе» в двоичном файле.
Он указывает компоновщику отбросить (собрать мусор) разделы, на которые нет ссылок.
Это означает, что func1
а также func2
будут отброшены, и поэтому будет не больше ссылок на globalvar
или же proc1
,