2014-01-29 99 views
0

我正在使用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)" ([email protected]@YIXXZ) referenced in function "void __fastcall Test2(void)" ([email protected]@YIXXZ)

+0

请给我们精确和完整的链接器错误信息。 –

+0

@KitFisto:请参阅编辑。 – doptimusprime

回答

1

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

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

+0

请参阅main的代码执行。它不应该由于死代码消除而链接,因此不应该有任何链接器错误。 – doptimusprime

+0

@dbasic“它不应该由于死代码消除而链接”你有没有参考? –

+0

@LuchianGrigore:请参阅/ OPT:REF here http://msdn.microsoft.com/en-us/library/bxwfs976.aspx – doptimusprime