为什么不能从静态库中导出符号?

时间:2012-03-20 16:35:55

标签: visual-studio-2010 opencv dependencies static-libraries zlib

我正在使用Visual Studio 2010构建OpenCV。我正在使用静态CRT链接(/ MTd),然后将opencv.lib链接到我的项目。但是我的项目中存在一个问题,即连接zlib,这是OpenCV所要求的:

Error   1   error LNK2019: unresolved external symbol _gzputs referenced in function "void __cdecl icvPuts(struct CvFileStorage *,char const *)" (?icvPuts@@YAXPAUCvFileStorage@@PBD@Z) o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   2   error LNK2019: unresolved external symbol _gzclose referenced in function "void __cdecl icvClose(struct CvFileStorage *)" (?icvClose@@YAXPAUCvFileStorage@@@Z)  o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   3   error LNK2019: unresolved external symbol _gzopen referenced in function _cvOpenFileStorage o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   4   error LNK2019: unresolved external symbol _gzgets referenced in function "char * __cdecl icvGets(struct CvFileStorage *,char *,int)" (?icvGets@@YAPADPAUCvFileStorage@@PADH@Z)  o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   5   error LNK2019: unresolved external symbol _gzrewind referenced in function "void __cdecl icvRewind(struct CvFileStorage *)" (?icvRewind@@YAXPAUCvFileStorage@@@Z)   o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   6   error LNK2019: unresolved external symbol _gzeof referenced in function "int __cdecl icvEof(struct CvFileStorage *)" (?icvEof@@YAHPAUCvFileStorage@@@Z) o:\products\MyProject\trunk\src\MyProject\opencv_core_vc10ds.lib(persistence.obj)   MyProject
Error   7   error LNK1120: 6 unresolved externals   O:\products\MyProject\trunk\src\Debug\MyProject.dll 1   1   MyProject

Zlib与OpenCV一起分发,当我在选中Link Library Dependecies选项的情况下构建它时,一切正常。但是,当我取消选中此选项并尝试手动将zlib链接到我的项目时,我会收到这些错误。

我在dumpbin /symbols上运行opencv_core_vc10ds.lib寻找其中一个符号:

3BE 00000000 UNDEF  notype ()    External     | _gzputs

同样适用于zlibd.lib

042 00000000 SECT10 notype ()    External     | _gzputs

所以看起来一切正常:我在OpenCV库中有UNDEF条目,并在zlib库中定义了外部条目。那么为什么它不能正确构建呢?

更新。我项目的链接器命令行:

/OUT:"O:\products\MyProject\trunk\src\Debug\MyProject.exe" /INCREMENTAL /NOLOGO /LIBPATH:"D:\SDK/MPFR/v3.1.0/MPFR/lib" /LIBPATH:"D:\SDK/MPIR/v2.5.1/MPIR/lib" /LIBPATH:"D:\SDK/JasPer/v1.900.1/JasPer/lib" /LIBPATH:"D:\SDK/CGAL/v3.9/lib" /LIBPATH:"D:\SDK/opencv/v2.3.1+IPPv7.0.205/opencv/lib" /LIBPATH:"D:\SDK/tinyxml/v2.0/tinyxml/lib" /LIBPATH:"D:\SDK/gtest/v1.6.0/gtest/lib" /LIBPATH:"D:\SDK\zlib\v125\zlib\lib" /LIBPATH:"D:\SDK\glew\v135\glew\lib" /LIBPATH:"D:\SDK\libpng\v141\libpng\lib" /LIBPATH:"D:\SDK\libtiff\v371\libtiff\lib" /LIBPATH:"D:\SDK\libgif\v40\libgif\lib" /LIBPATH:"D:\SDK\libjpeg\v6b\libjpeg\lib" /LIBPATH:"D:\SDK\intel\ComposerXE-2011\v6.233\compiler\lib" /LIBPATH:"D:\SDK\intel\ComposerXE-2011\v6.233\ipp\lib" /LIBPATH:"D:\SDK\intel\ComposerXE-2011\v6.233\mkl\lib" /LIBPATH:"D:\SDK\directx\v9.29.1962\directx\Lib\x86" /LIBPATH:"D:\SDK\boost\v1.48\stage\lib\" /MANIFEST /ManifestFile:"Debug\MyProject.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"O:\products\MyProject\trunk\src\Debug\MyProject.pdb" /SUBSYSTEM:CONSOLE /PGD:"O:\products\MyProject\trunk\src\Debug\MyProject.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE 

1 个答案:

答案 0 :(得分:1)

感谢mevatron,问题出在库链接顺序中。我的解决方案中有另一个使用MyLib的lib项目zlib,实际上在zlib中的MyProject之前已经链接。