繁体   English   中英

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

[英]unresolved external symbol referenced in function removed by /OPT:REF

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

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

}

If I package each function in a separate section/COMDAT and ask the linker to remove unused sections/COMDAT, I can get gcc to compile the program

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)

如何让 msvc 编译程序?

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

void foo();

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

int main()
{

}

尝试过,因为文档说:

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

但是不确定它是否是强大的解决方案,或者仅在这种特殊情况下有效。

偶然发现了一个 linker 开关:

cl incomplete.cpp /link /FORCE:UNRESOLVED

会发出警告,但实际上会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM