如何将 assimp 构建为静态库 (/MT)?

how to build assimp as a static lib (/MT)?

提问人:HolyCowOfDoom 提问时间:3/10/2023 最后编辑:HolyCowOfDoom 更新时间:3/17/2023 访问量:658

问:

我一直在尝试使用 CMakeGUI 将 assimp 构建为静态库。 我得到了assimp-3.1.1的源代码。构建位置位于 assimp-3.1.1/build。 我有 2 个似乎相关的选项:ASSIMP_BUILD_STATIC_LIB 和 BUILD_SHARED_LIBS。 在我尝试构建静态库时,我启用了第一个库并禁用了第二个库。我再次单击“配置”并生成了解决方案。在解决方案中,我单击了“构建解决方案”。然后在assimp-3.1.1/build/code/Debug中,我找到了assimpd.lib文件,它应该在/MT中。但事实并非如此。当我在我的项目中链接它时,我收到链接器错误,例如

检测到“RuntimeLibrary”LNK2038不匹配:值“MDd_DynamicDebug”与 main.obj Mush3D 中的值 >“MTd_StaticDebug”不匹配 C:\VSProjects\Mush3D\Mush3D\assimpd.lib(Importer.obj) 1

在 assimpd.lib 文件中。所以库在 MDd 中(我的项目在 MTd 中)。 在 VS22 的命令提示符中,我输入了“dumpbin /directives ”C:\assimp-3.1.1\build\code\Debug\assimpd.lib“ ” 查看其版本并发现以下内容:

链接器指令


/FAILIFMISMATCH:_CRT_STDIO_ISO_WIDE_SPECIFIERS=0 /FAILIFMISMATCH:_MSC_VER=1900 /FAILIFMISMATCH:_ITERATOR_DEBUG_LEVEL=2 /FAILIFMISMATCH:运行时库=MDd_DynamicDebug /DEFAULTLIB:msvcprtd /FAILIFMISMATCH:annotate_vector=0 /FAILIFMISMATCH:annotate_string=0 /DEFAULTLIB:MSVCRTD /DEFAULTLIB:旧名称

请注意,DEFAULTLIB msvcprtd 和 MSVCRTD 也是 /MDd。

我认为/FAILIFMISMATCH可能是负责任的。我在 assimp 解决方案、assimp-3.1.1 中的 CMakeList 或 assimp-3.1.1/build 中的 CMakeCache 中找不到它

我不知道还有什么地方可以寻找/FAILIFMISMATCH来更改它们(如果更改它们是解决方案)。 如果 /FAILIFMISMATCH 行不负责将我的库构建为 MDd,那么它还能是什么?我错过了其他设置吗?我无法通过解决方案属性页为整个解决方案更改它。

我应该放弃将 assimp 构建为静态库吗?由于我使用的 3 个库之间存在一些不匹配,我决定再次构建其中一些库并选择了 /MT(我的子弹物理库已经在 /MT 中),但也许将其他 2 个切换到 /MD 比在 /MT 中同化更容易......

编辑:似乎在 /MD 中构建 Bullet 物理库不是 Bullet 支持的东西,因此对我来说几乎是不可能的......那么,如果 Bullet 喜欢静态,而 assimp 喜欢动态,我该怎么办?

cmake 共享库 static-libraries 链接器错误 assimp

评论

1赞 SpacePotatoes 3/11/2023
这有点令人困惑。您将 assimp 构建为静态库,这并不意味着您将链接到静态 vc 运行时。如果你想控制 vc 运行时,有 cmake.org/cmake/help/latest/prop_tgt/MSVC_RUNTIME_LIBRARY.html。而且你对 Bullet 的断言是不正确的,MD 显然得到了支持(Buller CMakeLists 通过自定义选项做了一些保姆:github.com/bulletphysics/bullet3/blob/3.25/......USE_MSVC_RUNTIME_LIBRARY_DLL
0赞 HolyCowOfDoom 3/11/2023
@SpacePotatoes您在 assimp libs 运行时和 vc 运行时之间做出的区别是我想我以前听说过的。在了解这些事情时,我读到了一个问题,即一个库有一个运行时库(假设为 /MT),并且它本身链接到具有不同运行时库(假设为 /MD)的 MSVC 库。这是同样的区别,还是另一层?我发现这些图层令人困惑,我的大多数搜索提示都只会导致“静态与动态”问题。CRT 文档过于笼统。你知道我怎么能找到好的解释吗?我可以搜索什么提示?
1赞 SpacePotatoes 3/11/2023
库可以是共享的,也可以是静态的,并且可以链接到静态或动态 CRT。强烈建议针对同一 CRT 生成所有库。假设你的库是用 CMake 构建的,你有 CMake >= 3.15 并且你想要 /MD,你可以在这些库的 CMake 配置期间传递,它应该确保一些一致性。像 conan 或 vcpkg 这样的包管理器也可能有所帮助,他们会处理这些细节并修补损坏的构建文件,这些文件正在做疯狂的事情。-DMSVC_RUNTIME_LIBRARY=MultiThreadedDLL -DCMAKE_POLICY_DEFAULT_CMP0091=NEW

答:

2赞 KimKulling 3/17/2023 #1

要将 assimp 构建为静态库,您需要切换到最新版本 5.2.5 或最新的 master。获取源码,进入 repo / source 的根目录,使用 cmake 生成项目文件:

cmake CMakeLists.txt -dBUILD_SHARED_LIBS=OFF

现在,您将能够构建静态库。

评论

1赞 HolyCowOfDoom 3/21/2023
我没有注意到我使用的是过时的assimp版本。我确实设法将 assimp 构建为静态库,通过将MSVC_RUNTIME_LIBRARY添加到 CMakeList 链接到旧版本中的静态 CRT,但最新版本 5.2.5 确实有一个选项 USE_STATIC_CRT,这与我假设的相同。无论如何,两者似乎都有效。不幸的是,我遇到了另一个像这样的问题,它可能是相关的,我似乎无法解决,但我会再写一篇关于这个问题的帖子。