奇怪的链接器错误

时间:2014-01-29 08:49:29

标签: c++ linker skia

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

//main.cpp
int main ()
{
   Test();
}

void Test ()
{
}

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

当我用test.cpp编译main.cpp时,它给我链接器错误,Test3未定义,实际上不应该链接。当我从我的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)

1 个答案:

答案 0 :(得分:1)

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

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