Неразрешенный внешний символ, указанный в функции, удален из / OPT: REF - PullRequest
5 голосов
/ 15 апреля 2020

У меня есть функция bar (), которую я на самом деле не вызываю, которая вызывает невыполненную функцию foo ():

void foo();
void bar()
{
    foo();
}
int main()
{

}

Если я упаковываю каждую функцию в отдельном разделе / ​​COMDAT и спрашиваю компоновщик удалить неиспользуемые разделы / COMDAT, я могу получить g cc для компиляции программы

gcc -ffunction-sections -Xlinker --gc-sections LinkerFunctions.cpp

, но эквивалент в Visual C ++ 2019

cl /Gy LinkerFunctions.cpp /link /OPT:REF

лает, что

error LNK2019: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ) referenced in function "void __cdecl bar(void)" (?bar@@YAXXZ)

Как мне получить msv c для компиляции программы?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2020

Получил ваш пример работы, добавив inline, даже после добавления __declspec(noinline), чтобы предотвратить фактическое встраивание.

void foo();

__declspec(noinline)
inline void bar()
{
    foo();
}

int main()
{

}

Пробовал, потому что документация гласит:

Встроенные функции и функции-члены, определенные внутри объявления класса, всегда являются COMDAT.

Не уверен, однако, является ли это надежным решением или работает только в этом конкретном случае.

1 голос
/ 02 мая 2020

Случайно найден переключатель линкера для этого:

cl incomplete.cpp /link /FORCE:UNRESOLVED

выдаст предупреждение, но на самом деле будет работать.

...