奇怪的链接器错误

Posted

技术标签:

【中文标题】奇怪的链接器错误【英文标题】:Strange Linker error 【发布时间】:2014-01-29 08:49:28 【问题描述】:

我正在使用cl 编译器和LINK 链接代码。我在下面的示例代码中得到了非常奇怪的链接器。

//main.cpp
int main ()

   Test();


void Test ()



//test.cpp
void Test3 ();
void Test2 ()

   Test3 ();

当我用 test.cpp 编译 main.cpp 时,它给了我链接器错误 Test3 undefined 实际上不应该链接。当我从我的 makefile 中删除 test.cpp 时,它会毫无问题地编译和链接。

我正在使用skia 库。这个问题是否可能是由于skia库和某些链接选项不匹配造成的?

下面列出了我的编译器链接器选项:

编译器选项: /c /W4 /nologo /WL /Gr /GF /GA /Gy /GR- /vmb /EHsc /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /D_CRT_NON_CONFORMING_SWPRINTFS /DWIN32 /D_WIN32 /MT /Z7 /O2 /GS- /Oi

链接器选项: LINK skia_core.lib skia_utils.lib skia_effects.lib skia_images.lib skia_opts.lib skia_opts_ssse3.lib skia_ports.lib skia_sfnt.lib skia_skgpu.lib /INCREMENTAL:NO /NOLOGO /OPT:REF /IGNORE:4098 /IGNORE:4089 /SUBSYSTEM:WINDOWS /FIXED:NO /NODEFAULTLIB:advapi32.lib /NODEFAULTLIB:user32.lib /NODEFAULTLIB:gdi32.lib /NODEFAULTLIB:shell32.lib /NODEFAULTLIB:comdlg32.lib /NODEFAULTLIB:version.lib /NODEFAULTLIB:mpr.lib /NODEFAULTLIB:rasapi32.lib /DEFAULTLIB:winmm.lib /NODEFAULTLIB:winspool.lib /NODEFAULTLIB:vfw32.lib /NODEFAULTLIB:secur32.lib /NODEFAULTLIB:oleacc.lib /NODEFAULTLIB:oledlg.lib /NODEFAULTLIB:sensapi.lib /NODEFAULTLIB:kernel32.lib /NODEFAULTLIB:wininet.lib /NODEFAULTLIB:wsock32.lib /NODEFAULTLIB:odbc32.lib /NODEFAULTLIB:odbccp32.lib /NODEFAULTLIB:htmlhelp.lib /NODEFAULTLIB:comctl32.lib /NODEFAULTLIB:libc.lib unicows.lib kernel32.lib user32.lib winspool.lib gdi32.lib Rpcrt4.lib netapi32.lib wininet.lib wsock32.lib odbc32.lib odbccp32.lib htmlhelp.lib comctl32.lib advapi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib vfw32.lib secur32.lib oleacc.lib oledlg.lib DbgHelp.lib shlwapi.lib mstask.lib taskschd.lib psapi.lib crypt32.lib /VERSION:1.0 skia_core.lib skia_utils.lib skia_effects.lib skia_images.lib skia_opts.lib skia_opts_ssse3.lib skia_ports.lib skia_sfnt.lib skia_skgpu.lib /MAP /DEBUG /OPT:REF /NODEFAULTLIB:LIBCMTD.LIB psapi.lib crypt32.lib usp10.lib Opengl32.lib Gdiplus.lib /RELEASE /OUT:test.exe

链接器错误消息LNK2019: unresolved external symbol "void __fastcall Test3(void)" (?Test3@@YIXXZ) referenced in function "void __fastcall Test2(void)" (?Test2@@YIXXZ)

【问题讨论】:

请给我们准确完整的链接器错误信息。 @KitFisto:请看编辑。 【参考方案1】:

函数 Test3 只是声明但未定义。你需要为它写一些代码。

您希望链接器检测到不需要 Test3,即使它是从 Test2 调用的,因为从未调用过 Test2。您不能认为这是理所当然的,因为标准中没有保证。

【讨论】:

请看main中的代码执行。由于消除了死代码,它不应该被链接,因此不应该有任何链接器错误。 @dbasic "由于消除了死代码,它不应该被链接" 你有参考吗? @LuchianGrigore:请在此处查看 /OPT:REF msdn.microsoft.com/en-us/library/bxwfs976.aspx @dbasic 它在哪里说这个选项允许你问什么? @LuchianGrigore /OPT:REF eliminates functions and/or data that are never referenced;

以上是关于奇怪的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

Borland C++ Builder 6 上的奇怪链接器错误

链接到 opencv 的奇怪链接器错误...“LNK1107:无效或损坏的文件:无法在 0x2E8 读取”

遵循简单的内核教程时奇怪的链接器错误gcc

非常奇怪的链接器行为

使用静态成员时的链接器错误

构建时的链接器符号算术计算错误的结果