C++ 在静态库中包含静态库-代码块

C++ 在静态库中包含静态库-代码块,c++,c,linker,static-libraries,codeblocks,C++,C,Linker,Static Libraries,Codeblocks,我在使用Code::Blocks 13.12编译静态库时遇到问题。我需要从我自己的静态库中使用第三方静态库。所以,我有libOtherLib.a,我正试图在libOtherLib.a中构建libMyLib.a和link。问题是链接器在构建的链接阶段没有包含libOtherLib.a。以下是一些附加信息: 我正在使用GNU GCC编译器 整个项目的项目内构建选项(不是专门调试或发布) 我已经在链接器设置的链接库列表中添加了libOtherLib.a 我已经在搜索目录->链接器列表中添加了li

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

  • 我正在使用GNU GCC编译器
整个项目的项目内构建选项(不是专门调试或发布)

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

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

任何帮助都将不胜感激。我有一个线索,这是一个静态库,而不是一个应用程序(控制台或其他),但我不知道如何或为什么。我确实在“项目属性”窗口中将构建目标类型更改为“控制台应用程序”,它看起来像是在libOtherLib.a中链接,但它有其他错误,因为此代码是一个库而不是一个应用程序

以下是在生成结束时执行的链接器命令。libOtherLib.a不存在,这就是问题所在,只是不确定解决方案是什么

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

问题的可能原因也很好——如果这主要是编译器、链接器、设置或代码::块本身

不能在另一个静态库中链接静态库。 但是,您可以这样做:

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

由于libMyLib.a是静态库,因此不需要链接libMyLib.a,只需包含标题即可


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

构建一个静态库时,您只是将一组对象文件放在一个更易于发布和使用的实体中。构建静态库时不进行链接

在构建应用程序或某些共享对象时,将处理库中未解析的引用。您只需提供您的库,并要求用户在构建库时也提供您的库

如果要在库中包含所依赖的库,可以从tgat库中提取对象文件并将其包含到库中。虽然技术上可能,但您是否有权这样做是值得怀疑的。另外,这通常不是事情的处理方式,我建议不要这样做。

尽管有这些“链接不是这种哲学的正确术语”,但您可以通过补丁代码::块编译器配置来支持这一点,例如GCC/G++编译器

其想法是将GCC“高级编译器选项”窗口中的“将对象文件链接到静态库”脚本替换为:

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

然后可以将“libOtherLib.a”的相对路径放在项目的“其他链接器选项”编辑框中。这个mod实际上并没有得到官方认可,但它在我的项目中起作用,所以你可以在静态libs中获得静态libs,就像在msvisualstudio中一样

ar
不是链接器。构建静态库时不使用链接器。通常不会将一个静态库放入另一个静态库。要使用
MyLib
的应用程序应该同时链接
MyLib
OtherLib
。我最初尝试将这两个库链接到控制台应用程序项目,但当它尝试链接libMyLib.a时出现编译错误,因为它找不到libOtherLib.a(我得到了对…错误的未定义引用)。我认为这是以错误的顺序连接它们,但我认为这是一个完全不同的问题。