我有一个实际上并没有调用的函数 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 编译程序?
通过添加使您的示例正常工作inline,即使在添加__declspec(noinline)以防止实际内联之后也是如此。
void foo();
__declspec(noinline)
inline void bar()
{
foo();
}
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
尝试过,因为文档说:
在类声明内定义的内联函数和成员函数始终是 COMDAT。
但不确定它是否是强大的解决方案,或者仅适用于这种特殊情况。