在静态库中包含静态库 - CodeBlocks

时间:2014-08-25 21:55:16

标签: c++ c linker static-libraries codeblocks

我在使用Code :: Blocks 13.12编译静态库时遇到问题。我需要在我自己的静态库中使用第三方静态库。所以,我有libOtherLib.a,我试图在libOtherLib.a中构建libMyLib.a和链接。问题是链接器在构建的链接阶段不包括libOtherLib.a。以下是一些其他信息:

  • 我正在使用GNU GCC编译器

在整个项目的项目构建选项中(不是专门的调试或发布)

  • 我在链接器设置
  • 的链接库列表中添加了libOtherLib.a
  • 我在搜索目录中添加了libOtherLib.a的路径 - >链接列表
  • 我在搜索目录中为libOtherLib.a添加了.h文件的路径 - >编译器列表

  • 库编译完全正常(生成bin / Debug / libMyLib.a且没有错误)

非常感谢任何帮助。我有一个暗示它与静态库而不是应用程序(控制台或其他)有关,但我不确定如何或为什么。我确实将构建目标类型更改为"控制台应用程序"在Project Properties窗口中,它看起来像是在libOtherLib.a中链接,但它有其他错误,因为这段代码是一个库而不是一个应用程序。

这是在构建结束时执行的链接器命令。 libOtherLib.a不在任何地方,这就是问题,只是不确定解决方案是什么。

ar -r -s bin/Debug/libMyLib.a <all of my .o files> 

问题的可能原因也很好 - 如果这主要是编译器,链接器,设置或Code :: Blocks本身。

3 个答案:

答案 0 :(得分:3)

构建静态库时,您只需将一堆目标文件放在一个易于发布和使用的实体中。构建静态库时,没有链接已完成。

在构建应用程序或某些共享对象时,会处理来自库的未解析引用。您只需发送图书馆,并要求用户在构建时也提供图书馆所依赖的库。

如果要包含库中依赖的库,可以从tgat库中提取目标文件并将其包含在库中。虽然技术上可行,但如果您有权这样做,则值得怀疑。此外,这通常不是事情的完成方式,我建议不要这样做。

答案 1 :(得分:1)

您无法链接anoter静态库中的静态库。 但是,您可以这样做:

假设MyPrograme.exe需要链接静态库libMyLib.a,make MyPrograme.exe也链接libOtherLib.a。

由于libMyLib.a是静态库,因此无需链接libMyLib.a.Just包括标题。

构建静态库时,它只会被编译,而不能被链接。

答案 2 :(得分:1)

尽管所有这些&#34;链接不适合这个&#34;您可以修改Code :: Blocks编译器配置以支持此功能,例如GCC / G ++编译器。

http://green-candy.osdn.jp/codeblocks_config.html

我们的想法是将&#34; Link对象文件替换为静态库&#34; &#34;高级编译器选项中的脚本&#34;海湾合作委员会的窗口:

rm -f $static_output
$lib_linker -r -s -T $static_output $link_objects
$lib_linker -r -c -T $static_output $link_options

然后你可以把相对路径放到&#34; libOtherLib.a&#34;在&#34;其他链接器选项&#34;你的项目的编辑框。这个mod并没有真正得到正式认可,但它适用于我的项目,因此你可以在静态库中获得静态库,就像在MS Visual Studio中一样!