提问人:HolyCowOfDoom 提问时间:3/10/2023 最后编辑:HolyCowOfDoom 更新时间:3/17/2023 访问量:658
如何将 assimp 构建为静态库 (/MT)?
how to build assimp as a static lib (/MT)?
问:
我一直在尝试使用 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 喜欢动态,我该怎么办?
答:
要将 assimp 构建为静态库,您需要切换到最新版本 5.2.5 或最新的 master。获取源码,进入 repo / source 的根目录,使用 cmake 生成项目文件:
cmake CMakeLists.txt -dBUILD_SHARED_LIBS=OFF
现在,您将能够构建静态库。
评论
USE_MSVC_RUNTIME_LIBRARY_DLL
-DMSVC_RUNTIME_LIBRARY=MultiThreadedDLL -DCMAKE_POLICY_DEFAULT_CMP0091=NEW