繁体   English   中英

是否可以在C / C ++的其他库中包含静态链接的库?

[英]Is it possible to include statically linked libraries in other libraries in C/C++?

在我的项目中,静态链接库中有一些共享代码,供几个子项目使用,每个子项目都构建自己的可执行文件。 我使用ar.o文件创建库。 共享代码的一部分取决于静态链接的第三方库。

当前,我必须在每个makefile中(对于每个可执行文件)包括所有第三方库,并将它们传递给g++ 是否可以将这些库包含在子项目共享的一个库中,所以在构建不同的可执行文件时不必显式引用它们? 还是我的方法总体上有问题?

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

处理这种情况的常用方法是在顶级makefile或几个makefile包含的.inc文件中定义变量

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

然后将这些变量添加到标准变量中

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

上面的变量由GNU Make隐式链接规则使用; 如果您使用自己的规则,请确保使用以下变量,如下所示:

...
g++ $^ $(LDLIBS) $(LDFLAGS) -o $@

查看已建立的开源项目中的几个makefile,以获取启发。

参考文献:

不是您想要的方式。 基本上,静态库只是一堆要链接的目标文件,而且一个目标文件不可能暗示自动包含另一个目标文件。 因此,静态库无法要求另一个静态库自动包含在链接中。 另一方面,对于动态库,该库本身可以引用(动态)链接到的另一个库。

可以做的是使用隐式链接程序脚本来代替静态库,该脚本说明应包含哪个库。 例如在libfoo.a

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

这意味着-lfoo告诉链接器包括-lreal-foo (这将意味着原始的.a文件)和-lbar ,这将意味着链接器所依赖的库。

可行的方法是,每当链接器被告知与libfoo.a链接时,它将在意识到它不是归档文件(即.a文件)或目标文件时将尝试将其解释为链接器脚本。 然后, INPUT命令指示链接器包括该点所指定的那些文件,特别是如果它们以-lFILE形式-lFILE ,它将如同-lFILE被包含在命令行中一样-lFILE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM