Visual studio 2010 版本x64上的链接问题 我有一个Visual Studio 2010 C++项目,它静态链接到 TyyXMLSTL> /Cudio2.5.5(TyyXMLSTL.LIB)和 ZLIB < /COD>1.2.7。(zlibstat.lib)。共有4个版本,涵盖x86和x64以及调试和发布

Visual studio 2010 版本x64上的链接问题 我有一个Visual Studio 2010 C++项目,它静态链接到 TyyXMLSTL> /Cudio2.5.5(TyyXMLSTL.LIB)和 ZLIB < /COD>1.2.7。(zlibstat.lib)。共有4个版本,涵盖x86和x64以及调试和发布,visual-studio-2010,visual-studio,zlib,tinyxml,Visual Studio 2010,Visual Studio,Zlib,Tinyxml,除版本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 如果我将/NODEFAU

除版本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和两个lib)都设置为在发布版本中使用
多线程(/MT)
选项,但是x86版本很好,而x64则存在上述问题


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

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

根据,使用
/MD
调用MSVCRT.lib


编辑:

根据你的评论,听起来zlib可能是罪魁祸首

zlib既有静态版本也有dll版本,但默认情况下,这两个版本都使用
/MD
标志,因此除非在构建zlib时更改此标志,否则这是您的问题

要使用
/MT
构建zlib:

  • 如果尚未安装,请安装

  • 下载并解压缩到例如
    C:\devel
    。下载链接在主页的一半左右。目前,它提供了zlib版本1.2.7

  • 要解决此问题,请添加

    到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方案C:\devel\zlib-1.2.7\build\zlib.sln,您可以打开它。将“zlibstatic”目标的设置分别更改为发布和调试时的
    /MT
    /MTd


    构建每个将在build的子目录中生成zlibstatic.lib;“发布”或“调试”。

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

    根据,使用
    /MD
    调用MSVCRT.lib


    编辑:

    根据你的评论,听起来zlib可能是罪魁祸首

    zlib既有静态版本也有dll版本,但默认情况下,这两个版本都使用
    /MD
    标志,因此除非在构建zlib时更改此标志,否则这是您的问题

    要使用
    /MT
    构建zlib:

  • 如果尚未安装,请安装

  • 下载并解压缩到例如
    C:\devel
    。下载链接在主页的一半左右。目前,它提供了zlib版本1.2.7

  • 要解决此问题,请添加

    到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方案C:\devel\zlib-1.2.7\build\zlib.sln,您可以打开它。将“zlibstatic”目标的设置分别更改为发布和调试时的
    /MT
    /MTd


    构建每个将在build的子目录中生成zlibstatic.lib;“Release”或“Debug”。

    在所有项目的项目属性中,检查它们是否都使用相同的运行时类型:DLL或static

    这可以在项目属性->C/C++->代码生成->运行库下找到。确保已选择版本x64构建


    特定的值不是很重要(就编译错误而言),但它们在所有项目的项目属性中都应该相同,请检查它们是否都使用相同的运行时类型:DLL或static

    这可以在项目属性->C/C++->代码生成->运行库下找到。确保已选择版本x64构建


    特定的值不是很重要(就编译错误而言),但它们应该都是相同的

    我知道您说所有的lib都与/MT链接,但该错误表明其中一个不是。重新检查是否将正确的LIB与x64发行版链接。

    我知道您说所有LIB都与/MT链接,但该错误表明其中一个LIB没有链接。重新检查是否已将正确的LIB链接到x64发行版。

    链接器错误毫无疑问,您认为始终选择了/MT的假设是错误的。是的,我现在理解了,但这让我想知道问题出在哪里。编辑问题和附加项目设置的屏幕截图可能毫无用处。我想到的一件事是,自从添加了
    zlib
    项目以来,x64构建就停止了构建。因此,
    zlib
    可能是罪魁祸首,但运行时库肯定设置为/MT.@wpfwannabe-我已经更新了答案,包括使用
    /MT
    构建zlib的说明。链接器错误毫无疑问,您认为/MT始终被选中的假设是错误的。是的,我现在明白了,但这让我想知道问题出在哪里。编辑问题和附加项目设置的屏幕截图可能毫无用处。我想到的一件事是,自从添加了
    zlib
    项目以来,x64构建就停止了构建。所以
    zlib
    可能是罪魁祸首,但运行时库肯定设置为/MT.@wpfwannabe-我已经更新了答案,包括使用
    /MT
    构建zlib的说明。谢谢!我现在无法尝试你的解决方案,但它可能正好提供了我现在已有的解决方案。请记住,从zlib网站下载的存档文件
    zlib-1.2.7.tar.bz2
    已经包含VS 2010的SLN。没有必要走下坡路
    if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND MSVC)
      set_target_properties(zlibstatic PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64")
    endif()