0

我有一个静态链接到tinyxmlSTL2.5.5 (tinyxmlSTL.lib) 和zlib1.2.7 的 Visual Studio 2010 C++ 项目。(zlibstat.lib)。总共有 4 个构建,涵盖 x86 和 x64 以及调试和发布。

所有组合都会生成工作版本,但 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

基本上,所有项目(应用程序和两个库)都设置为Multi-threaded (/MT)在发布版本中使用选项,但是 x86 构建很好,而 x64 则存在上述问题。

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

4

3 回答 3

2

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

根据MSVC 文档,MSVCRT.lib 是通过使用调用的/MD


编辑 :

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

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

要使用以下命令构建 zlib /MT

  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:\devel\zlib-1.2.7

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

这将为您提供一个可以打开的 VS sloution C:\devel\zlib-1.2.7\build\zlib.sln。将“zlibstatic”目标的设置分别更改为 Release/MT/MTdDebug。

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

于 2012-08-25T13:23:36.267 回答
1

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

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

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

于 2012-08-25T13:24:22.520 回答
1

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

于 2012-08-25T13:25:32.310 回答