我有一个.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没有得到定义
答案 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
。我要指出这一点,因为我第一次必须解决这个问题,所以我假设链接的类型(共享的或静态的)是用某些选项(常见错误,我认为)指定的,但实际上是给出了这种链接的对象对象,取决于您提供给链接器的文件类型,而不是带有命令行选项。除此之外,它还会使链接器在程序中缺少某些引用时不遵守(它会在以后的链接中解决这些引用)