发布x64上的链接问题

时间:2012-08-25 13:18:28

标签: visual-studio-2010 visual-studio zlib tinyxml

我有一个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则遇到上述问题。

非常感谢任何帮助或想法。

3 个答案:

答案 0 :(得分:2)

您需要仔细检查x64的设置。其中一个项目使用/MD标志而不是/MT

根据MSVC docs,使用/MD调用MSVCRT.lib。


编辑:

根据你的意见,听起来zlib可能是罪魁祸首。

zlib既有静态版本又有dll版本,但默认情况下这两个版本都使用/MD标志,所以除非你在构建zlib时更改了它 - 这就是你的问题。

使用/MT构建zlib:

  1. 如果您还没有这样做,请安装CMake

  2. 下载zlib并将其解压缩至例如C:\devel。下载链接大约是主页的一半。目前,这提供了zlib版本1.2.7。

  3. 要解决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

  4. 的结尾
  5. VS10命令提示符中,cd C:\devel\zlib-1.2.7

  6. cmake -H. -Bbuild -G"Visual Studio 10 Win64"

  7. 这将为您提供一个可以打开的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版本链接。