Ошибка компоновщика неиспользуемой переменной и функции

Я написал следующую тестовую программу

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

-1

Решение

Вы можете это исправить, в gcc, как это:

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

Это делает две вещи:

  1. Он указывает компилятору выдавать каждую функцию в своем собственном «разделе» в двоичном файле.

  2. Он указывает компоновщику отбросить (собрать мусор) разделы, на которые нет ссылок.

Это означает, что func1 а также func2 будут отброшены, и поэтому будет не больше ссылок на globalvar или же proc1,

1

Другие решения


По вопросам рекламы [email protected]