c++ - 将文件 (.a) 链接到共享对象 (.so)

标签 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

最佳答案

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

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

关于c++ - 将文件 (.a) 链接到共享对象 (.so),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935421/

相关文章:

linux - 两个进程使用的共享库

c++ - libgcc_s.so 冲突会导致 cpu 过载使用异常?

c++ - 隐藏 C++ 库的私有(private)成员

c++ - OSX + 离屏渲染 + CoreGL + 帧缓冲区 + 着色器 = 头痛?

macos - OS X 运行时链接器发现错误的 lib 版本

ios - 链接器错误 : undefined symbols, 未找到符号

build - 谷歌 V8 构建错误 LNK1104 : cannot open file 'ws2_32.lib'

c++ - 为什么在传递字符串作为文件名而不是 char* 时会出现错误?

c++ - 为什么 realloc 会使我的自定义分配器数据无效?

c++ - arm gcc5 的交叉编译 - 正确使用 memcpy