2015-08-26 49 views
2

在我的项目中,我有一些静态链接库中的一些共享代码,由几个子项目使用,每个子项目都构建自己的可执行文件。我使用ar.o文件创建库。部分共享代码取决于静态链接的第三方库。是否可以在C/C++的其他库中包含静态链接库?

目前,我必须在每个makefile中包含所有第三方库(对于每个可执行文件)并将它们传递给g++。是否有可能将这些库包含在子项目共享的一个库中,因此,在构建不同的可执行文件时,我不必明确引用它们?或者我的方法总体上有什么问题吗?

+1

“我[...]静态链接”, “创建共享库”, “使用AR来创建共享”。 ..什么是共享/静态似乎有矛盾。 –

+0

“共享库”是指子项目共享的.a文件。它是一个静态链接库。我编辑了这个问题来说明问题。 – lex82

+0

当然,您可以使用'ar'来创建一个巨大的超级档案。你也可以使用像pkg-config这样的工具来跟踪你的依赖关系。 –

回答

2

可以将您正在使用的所有静态库打包到一个大型库中。你不想那样。

处理情况的常用方法是定义在顶层Makefile文件变量,或在.INC文件中包含几个生成文件:

MY_LIBS = -lOne -lTwo 
MY_LDFLAGS = -L /path/to/libs 

,然后将这些变量标准变量

LDLIBS += $(MY_LIBS) 
LDFLAGS += $(MY_LDFLAGS) 

上面的变量被GNU Make使用隐式链接规则;如果您使用的是自己的规则,一定要使用这些变量,像这样:

... 
g++ $^ $(LDLIBS) $(LDFLAGS) -o [email protected] 

看从成立开源项目数makefile文件中寻找灵感。

参考文献:

+0

谢谢,我会尽力这样做。我可能会在makefile中有一些相对路径问题(我试图通过将所有东西塞进一个大型库中来避免),但是我想我应该修复这些路径。 – lex82

1

不是你想要的样子。基本上静态库只是一堆要链接的目标文件,一个目标文件无法隐含另一个目标文件的自动包含。因此静态库不能调用另一个静态库被自动包含在链接中。另一方面,对于动态库,库本身可能会引用(将动态地)链接到的另一个库。

可能做的是使用隐式链接器脚本来代替静态库应该包括哪个库。例如,在libfoo.a

INPUT(-lreal-foo) 
INPUT(-lbar) 

将意味着-lfoo告知链接包括-lreal-foo(这将意味着你原来.a文件)和-lbar这将意味着它依赖于库。

的工作是,每当连接器被告知与libfoo.a链接它会当它意识到这不是一个档案(即.a文件)或目标文件,它会尝试将其解释为一个链接脚本。 INPUT命令然后指示链接器包括那些文件,因为它们将在该点指定,特别是如果它们在表格-lFILE上,它将起作用,就好像-lFILE包含在命令行中一样。

+0

这样的链接脚本可以像静态库一样使用吗? –

+0

@PaulGroke是的,如果链接器不能将其识别为目标文件或存档,它会尝试将其解释为隐式链接器脚本。事实上,这已经用于(一些)x86-64 linux上的一些库。 – skyking

+0

啊,谢谢。有趣。 :) –

相关问题