在Linux中将.a文件与.so共享库文件绑定

时间:2018-07-11 10:01:07

标签: c linux gcc libtool

我有一个.a文件(ar命令),我想在GCC编译过程中将其与.so文件绑定。

我该怎么做。

如果我运行此命令:

gcc /usr/local/apr/lib/libapr-1.a ../../ndagentlibc/obj/*.o tideways_xhprof.o tracing.o -shared -o libhello.so


nm libhello.so | grep apr_term

output:  U    apr_terminate

apr_terminate没有得到定义

2 个答案:

答案 0 :(得分:0)

如果您的.so文件需要.a文件,请将您的.so.a文件链接,并且.a存档中所有需要的代码将可以在.so文件中使用。

答案 1 :(得分:0)

重新排序命令,并将.a库放在最后...

gcc ../../ndagentlibc/obj/*.o tideways_xhprof.o tracing.o -shared -o libhello.so /usr/local/apr/lib/libapr-1.a

,因为ld(1)链接器仅选择包含在库存档中的对象模块(*.o),该对象知道在读取时 有未解决的引用(如您将其放在命令行的第一位,到那时没有未解决的引用出现,因此在库处理时没有选择并包含库.o组件)

对于目标模块的归档,链接器将尽其所能,仅选择那些似乎必要的文件,并首先放置一个归档文件,以使链接器不会从中选择任何要链接的文件。

注意

顺便说一句,-shared选项用于创建可能不是您想要的共享对象(.so模块)。如果要创建最终的可执行程序,请不要使用-shared。我要指出这一点,因为我第一次必须解决这个问题,所以我假设链接的类型(共享的或静态的)是用某些选项(常见错误,我认为)指定的,但实际上是给出了这种链接的对象对象,取决于您提供给链接器的文件类型,而不是带有命令行选项。除此之外,它还会使链接器在程序中缺少某些引用时不遵守(它会在以后的链接中解决这些引用)