我有一个Visual Studio 2010 C ++项目,它静态链接到tinyxmlSTL
2.5.5(tinyxmlSTL.lib)和zlib
1.2.7。 (zlibstat.lib)。共有4个版本,涵盖x86和x64以及Debug和Release。
除了Release 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
基本上,所有项目(app和两个libs)都设置为在Release版本中使用Multi-threaded (/MT)
选项,但x86构建得很好,而x64则遇到上述问题。
非常感谢任何帮助或想法。
答案 0 :(得分:2)
您需要仔细检查x64的设置。其中一个项目使用/MD
标志而不是/MT
。
根据MSVC docs,使用/MD
调用MSVCRT.lib。
编辑:
根据你的意见,听起来zlib可能是罪魁祸首。
zlib既有静态版本又有dll版本,但默认情况下这两个版本都使用/MD
标志,所以除非你在构建zlib时更改了它 - 这就是你的问题。
使用/MT
构建zlib:
如果您还没有这样做,请安装CMake
下载zlib并将其解压缩至例如C:\devel
。下载链接大约是主页的一半。目前,这提供了zlib版本1.2.7。
要解决this CMake bug,请添加
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:\devel\zlib-1.2.7
cmake -H. -Bbuild -G"Visual Studio 10 Win64"
这将为您提供一个可以打开的VS sloution C:\ devel \ zlib-1.2.7 \ build \ zlib.sln。对于发布和调试,分别将“zlibstatic”目标的设置更改为/MT
和/MTd
。
构建每个将在build的子目录中产生zlibstatic.lib; “发布”或“调试”。
答案 1 :(得分:1)
在所有项目的项目属性中,检查它们是否都使用相同的运行时类型:DLL或静态
这可以在Project Properties - >下找到。 C / C ++ - >代码生成 - >运行时库。确保选择了Release x64版本。
特定值不是很重要(就编译错误而言)但它们应该都是相同的
答案 2 :(得分:1)
我知道你说所有你的lib都与/ MT链接但是这个错误表明其中一个不是。重新检查正确的库是否与x64 Release版本链接。