【问题标题】:C++ Linking static librarys to a dynamic libraryC++ 将静态库链接到动态库
【发布时间】: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


【解决方案1】:

简短的回答,是的。

虽然您可以只将动态库链接到它,但在某些情况下,这可能会导致严重问题,具体取决于库的编写方式(状态信息等)。

虽然工作量更大,但包装 DLL 可能是最安全的做法。但是,这被以下事实所抵消:您只需要包装从应用程序的各个组件实际调用的函数,而不是库提供的整个 API。此外,您需要对实际包装的函数进行某种轻微的重命名,以防止歧义。

编辑时: 只是看了一下子弹物理库,因为我个人并不熟悉它,并且在我最初回答后对您的选择感到好奇。如果他们明确表示不支持库的动态构建,我认为包装您实际使用的任何功能肯定是最安全的。太糟糕了。我希望它的横截面不要太大。

【讨论】:

  • 明确的问题是,子弹库是用 /MT 标志编译的,据我了解,你不能链接到两个运行时。
  • 按照cmake的说明,你是用MSVC运行库编译的,但是我编译失败了。
  • 您使用的是什么版本的 Bullet 和 Visual Studio?我看到的最新 VS 解决方案是针对 Bullet 3 的 VS2010。针对 Bullet 2.x 的 VS 的最新版本是(我相信)VS2005。此外,它如何/在哪里失败(编译器,链接器)以及什么消息?
  • 用不同的选项重建它,我会在几秒钟内发布。我正在构建 bullet3 以将其包含在 Visual Studio 2013 for Desktop 编辑中:“131 个错误,LNK1169:找到一个或多个多重定义的符号”和“错误 665 错误 LNK2038:检测到 'RuntimeLibrary' 不匹配:值 'MTd_StaticDebug' 没有” t 匹配 GpuDemo.obj 中的值 'MDd_DynamicDebug' 等
  • 您最终是编写了一个包装 dll,还是只是从您的一个 dll 或应用程序本身链接到静态库?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多