/OPT:REF 删除的函数中引用的未解析外部符号

Bru*_*nez 5 visual-c++

我有一个实际上并没有调用的函数 bar(),它调用了未实现的 foo():

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

}
Run Code Online (Sandbox Code Playgroud)

如果我将每个函数打包在一个单独的部分/COMDAT 中并要求链接器删除未使用的部分/COMDAT,我就可以让 gcc 来编译程序

gcc -ffunction-sections -Xlinker --gc-sections LinkerFunctions.cpp
Run Code Online (Sandbox Code Playgroud)

但等效于 Visual C++ 2019

cl /Gy LinkerFunctions.cpp /link /OPT:REF
Run Code Online (Sandbox Code Playgroud)

吠叫

error LNK2019: unresolved external symbol "void __cdecl foo(void)" (?foo@@YAXXZ) referenced in function "void __cdecl bar(void)" (?bar@@YAXXZ)
Run Code Online (Sandbox Code Playgroud)

如何让 msvc 编译程序?

Ale*_*iev 5

通过添加使您的示例正常工作inline,即使在添加__declspec(noinline)以防止实际内联之后也是如此。

void foo();

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

int main()
{

}
Run Code Online (Sandbox Code Playgroud)

尝试过,因为文档说:

在类声明内定义的内联函数和成员函数始终是 COMDAT。

但不确定它是否是强大的解决方案,或者仅适用于这种特殊情况。