x64版本上的链接问题



我有一个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

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

  2. 下载并提取zlib到例如C:devel。下载链接大约在主页的一半。目前它提供了zlib 1.2.7版本。

  3. 要解决这个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 的末尾

  4. VS10命令提示符中,cd C:develzlib-1.2.7

  5. 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内部版本链接。

相关内容

  • 没有找到相关文章

最新更新