【发布时间】:2015-02-22 19:40:27
【问题描述】:
我有一个项目foo,它依赖于a,它又依赖于b,又依赖于c。我的构建脚本 pull/configure/make 以正确的顺序从源代码中提取了三个依赖项,它们编译得很好。
现在,要分发foo.so,我还需要同时分发它的所有依赖项(a.so、b.so 和c.so)。我想构建一个foo.so,其中包含foo 的所有对象及其所有依赖项;这样我就可以分发一个库。
a、b和c都使用autotools,并在src/目录下生成相关的*.o文件,还有一个.libs/目录下包含了一些常用的*.ar, *.lo、*.lai 和 *.so 文件均有效。现在,我正在使用这组 gcc 标志来构建我的foo.so:
gcc -shared ./my/src/*.c \
-I./a/include -I./b/include -I./c/include \
-L ./a/.libs -L./b/.libs -L./c/.libs \
-la -lb -lc \
-o ./foo.so \
-w -fPIC -m64 \
-std=c99
(请注意,“-la -lb -lc”只是每个依赖项的“-l”标志,我不只是弄乱标志)。
在结果foo.so 上使用readelf -d 确实表明它依赖于a。鉴于我已经获得了所有依赖项的所有构建文件,我真的觉得我只是缺少一些“在查找要链接的 *.o 文件时包含此路径”的标志。
我尝试了很多方法,老实说,我什至不记得导致它们的不同错误和条件。最有希望的线索是this question,但是在删除我的“-l”行以支持“-Wl,--whole-archive”行之后,我收到了这个错误(注意“a.a”只是*.a for a):
/usr/bin/ld: ./a/.libs/a.a(bands.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
./a/.libs/a.a(bands.o): error adding symbols: Bad value
这对我来说毫无意义,因为这些文件必须是 PIC 才能将它们构建成 *.so,对吧?这些依赖项的构建过程会生成一个 *.so。
如果重要的话,我正在使用 Mint Linux。
【问题讨论】:
-
如果您有
.la文件,请使用libtool处理linking。例如,libtool --mode=link gcc -o foo.la ./my/src/*.lo ./a/a.la ./b/b.la ./c/c.la- 要求使用libtool --mode=compile gcc <cflags> -c file.c构建源对象