在静态库中包含另一个静态库 - CodeBlocks

3
我在使用Code::Blocks 13.12编译静态库时遇到了问题。我需要在自己的静态库中使用第三方静态库。所以,我有一个libOtherLib.a,我正在尝试构建libMyLib.a并链接libOtherLib.a。问题在于,在构建的链接阶段,链接器没有包含libOtherLib.a。以下是一些额外的信息:
  • 我正在使用GNU GCC编译器

在整个项目的项目构建选项中(不是特定于Debug或Release),我:

  • 在链接器设置中的链接库列表中添加了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> 

如果问题主要是由编译器、链接器、设置或者Code::Blocks本身引起的,那么列出问题可能的原因也会很有用。


ar 不是一个链接器。在构建静态库时不使用链接器。通常不会将一个静态库放入另一个静态库中。想要使用 MyLib 的应用程序应该同时链接 MyLibOtherLib - Oktalist
3个回答

3
构建静态库时,您只需将一堆目标文件组合成一个更易于发布和使用的实体。在构建静态库时不会进行链接。
来自库的未解决引用是在构建应用程序或某些共享对象时处理的。您只需发布您的库并要求用户在构建时也提供您的库所依赖的库即可。
如果您想在您的库中包含所依赖的库,您可以从该库中提取目标文件并将它们包含到您的库中。虽然技术上是可能的,但是这样做是否具有合法权利值得质疑。此外,通常不是这种做事情的方式,我建议不要这样做。

我最初尝试将两个库链接到控制台应用程序项目中,但在尝试链接libMyLib.a时出现编译错误,因为它找不到libOtherLib.a(我得到一个未定义的引用错误)。我认为它们的链接顺序是错误的,但我认为这是完全不同的问题。 - ang mcg

1
尽管存在“链接不是正确的术语”这种思想,但你可以修补Code::Blocks编译器配置以支持此功能,例如针对GCC/G++编译器。

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

这个想法是用以下内容替换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”的相对路径。这个修改并不是官方认可的,但它在我的项目中有效,所以您可以像在MS Visual Studio中一样获得静态库中的静态库!


1

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

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

由于libMyLib.a是静态库,因此不需要链接libMyLib.a。只需包含头文件即可。

当构建静态库时,它将仅被编译,而不会被链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接