【发布时间】:2015-01-22 11:15:24
【问题描述】:
这有点烦人。
我有一个完全动态链接的项目,但我想使用一个似乎只设计为静态链接的库,使用 /MT 标志,是否可以构建一个单独的 dll 来链接到静态链接libs 然后在我的项目中链接到那个?
我很抱歉解释的仓促,我很累。
有问题的库是子弹物理库。
编辑:
好吧,通过更多的谷歌搜索,似乎可以有一个 /MD/MDd 编译版本,虽然我不确定它的位置。
编辑(任何有兴趣的人): 根据这个页面:http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=3846
“如果您的整个引擎是使用 /MD 标志编译的,那么您将使用 'release DLL' 版本的项目符号。您不应将使用 /MD 编译的库与使用 /MT 编译的库混合使用。这是主要区别。那里没有用于项目符号的“单独的 DLL (.dll)”文件。”
编辑:如果我使用 MSVC 运行时库构建它,那么它会失败。
总之,我不知道该怎么办。
他就是我正在做的事情:
使用 Visual Studio 12, 2013 编译器在 cmake 中构建整个库。 然后构建cmake构建的项目,构建所有需要的项目。
这是提供的说明。 Here
最后编辑:非常感谢大家的帮助!我最终成功构建了它
抱歉有任何拼写错误,当时我很累:3
【问题讨论】:
-
我相信答案是否定的,因为运行时不匹配。我认为,在最坏的情况下,你可能会导致内存损坏,而在最好的情况下链接失败。
-
我希望我错了,因为我也有兴趣能够做到这一点,并了解更多相关信息
-
这真的很令人沮丧,而且互联网上几乎没有关于这个主题的信息,包括他们的论坛。
-
@LyndenShields:是的,您可以围绕静态库创建包装 DLL。 OP 只需要使用与系统中其他组件相同的编译器和运行时来构建子弹物理库 - 因此,单个运行时(尽管 BPL 在其解决方案文件中支持“动态构建”选项,它只是意味着使用 MSVCRT 的 DLL 版本 - 您仍然可以获得 BPL 本身的静态库)。因此,一个通用的运行时环境使包装 DLL 可以正常工作。如果 OP 不能自己构建 BPL,他们真的会被搞砸。现在,他们只是非常不便。好像这样更好。 :)
-
RE: /MD 和 /MDs 版本的库,你仍然没有得到子弹库的静态库 - 你得到一个静态库,它只使用 MSVC 运行时的 DLL 版本.
标签: c++ dynamic static-libraries linker-errors bulletphysics