将存档(.a)链接到共享对象(.so)

时间:2011-10-28 22:12:12

标签: c++ linker shared-libraries

我正在将一些共享对象文件编译为archive.a

$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp
$ ar rvs archive.a object1.o object2.o
r - object1.o
r - object2.o

到目前为止一切顺利。生成的archive.a具有一些KB的大小。带nm的转储显示相应的对象文件包含在文件中。

现在我想将其中几个档案编译成一个共享对象文件。

g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a

结果是我生成的库文件几乎为空

$ nm -D libLibrary.so
                 w _Jv_RegisterClasses
0000000000201010 A __bss_start
                 w __cxa_finalize
                 w __gmon_start__
0000000000201010 A _edata
0000000000201020 A _end
0000000000000578 T _fini
0000000000000430 T _init

知道我做错了吗?


修改

当我尝试切换-Wl,--whole-archive时,会发生以下情况:

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0xd): undefined reference to `__init_array_end'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object
/usr/bin/ld: final link failed: Bad value
collect2: ld returned 1 exit status
make: *** [libKeynect.so] Error 1

2 个答案:

答案 0 :(得分:18)

未使用的.a文件中的符号/目标文件将被链接器丢弃。

使用-Wl,--whole-archive进行链接以包含整个.a文件 修改后,您还需要在指定库后添加-Wl,--no-whole-archive,因此整个内容将为-Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

答案 1 :(得分:7)

关于你的编辑:在你正在运行的链接命令的末尾加上“-Wl, - no-whole-archive”。这为我解决了。