我有一个Visual Studio 2010 C++项目,它静态链接到tinyxmlSTL
2.5.5(tinyxmlSTL.lib)和zlib
1.2.7。(zlibstat.lib)。共有4个版本,涵盖x86和x64以及调试和发布。
除了x64版本外,所有组合都会生成工作版本,x64版本会出现一系列错误,如下所示:
MSVCRT.lib(MSVCR100.dll) : error LNK2005: free already defined in LIBCMT.lib(free.obj)
和一个警告:
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
如果我将/NODEFAULTLIB:MSVCRT
添加到应用程序的链接器选项中,那么我得到的是:
zlibstat.lib(ioapi.obj) : error LNK2001: unresolved external symbol __imp__ftelli64
zlibstat.lib(ioapi.obj) : error LNK2001: unresolved external symbol __imp__fseeki64
基本上,所有项目(应用程序和两个库)都设置为在Release构建中使用Multi-threaded (/MT)
选项,但x86构建很好,而x64则存在上述问题。
任何帮助或想法都将不胜感激。
您需要仔细检查x64的设置。其中一个项目是使用/MD
标志而不是/MT
。
根据MSVC文档,使用/MD
调用MSVCRT.lib。
编辑:
根据你的评论,听起来zlib可能是罪魁祸首。
zlib有静态版本和dll版本,但默认情况下这两个版本都使用/MD
标志,所以除非您在构建zlib时更改了这一点,否则这就是您的问题。
使用/MT
:构建zlib
-
如果您还没有这样做,请安装CMake
-
下载并提取zlib到例如
C:devel
。下载链接大约在主页的一半。目前它提供了zlib 1.2.7版本。 -
要解决这个CMake错误,请添加
if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MSVC) set_target_properties(zlibstatic PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64") endif()
到C:\devel\zlib-1.2.7\CMakeLists.txt 的末尾
-
在VS10命令提示符中,
cd C:develzlib-1.2.7
-
cmake -H. -Bbuild -G"Visual Studio 10 Win64"
这将为您提供一个可以打开的VS slation C:\devel\zlib-1.2.7\build\zlib.sln。将"zlibstatic"目标的设置更改为/MT
和/MTd
,分别用于Release和Debug。
构建每个将在build的子目录中生成zlibstatic.lib;"发布"或"调试"。
在所有项目的项目属性中,检查它们是否都使用相同的运行时类型:DLL或静态
这可以在"项目属性"->"C/C++"->"代码生成"->"运行库"下找到。请确保已选择x64版本内部版本。
特定的值不是很重要(就编译错误而言),但它们都应该是相同的
我知道你说所有的lib都与/MT链接,但这个错误表明其中一个不是。请重新检查是否将正确的库与x64 Release内部版本链接。