相关疑难解决方法(0)

将静态库转换为共享库?

我有一个第三方库,主要包含大量的static(.a)库文件.我可以将它编译成单个.a库文件,但我真的需要它作为单个.so共享库文件.

有没有办法将静态.a文件转换为共享.so文件?或者更一般地说,有一种很好的方法可以将大量静态.a文件与一些.o目标文件合并到一个.so文件中?

c linux shared-libraries static-libraries

50
推荐指数
5
解决办法
5万
查看次数

如何在共享对象中包含存档的所有对象?

当编译我们的项目,我们创建几个档案(静态库),说liby.alibz.a每个包含定义函数的对象文件y_function()z_function().然后,这些存档被连接在一个共享对象中,比如说libyz.so,这是我们的主要可分发目标之一.

g++  -fPIC  -c -o y.o y.cpp
ar cr liby.a y.o
g++  -fPIC  -c -o z.o z.cpp
ar cr libz.a z.o
g++ -shared -L. -ly -lz -o libyz.so
Run Code Online (Sandbox Code Playgroud)

当使用该共享对象到示例程序,比方说x.c,链接失败,因为到功能的未定义的引用y_function()z_function().

g++ x.o -L. -lyz -o xyz
Run Code Online (Sandbox Code Playgroud)

但是,当我将最终可执行文件直接与归档(静态库)链接时,它可以工作.

g++ x.o -L. -ly -lz -o xyz
Run Code Online (Sandbox Code Playgroud)

我的猜测是,归档中包含的目标文件没有链接到共享库中,因为它们中没有使用它们.如何强制包容?

编辑:

可以使用--whole-archive ld选项强制包含.但如果导致编译错误:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x1d): undefined …
Run Code Online (Sandbox Code Playgroud)

linux linker gcc archive

15
推荐指数
1
解决办法
1万
查看次数

将对象从 C++ 存档 (.a) 包含到共享库中

我正在尝试将一些目标文件包含到我正在构建的共享库中。执行以下命令(为简洁起见,已省略 [ETC] 中的内容):

/usr/bin/c++ -fPIC -std=c++14 -pthread -Iinclude/ext/liveMedia -Iinclude/ext/groupsock [ETC] -g -shared -Wl,-soname,libValkka.so -o lib/libValkka .so CMakeFiles/Valkka.dir/src/avthread.cpp.o CMakeFiles/Valkka.dir/src/opengl.cpp.o [ETC] CMakeFiles/Valkka.dir/src/decoders.cpp.o -lX11 -lGLEW -lGLU -lGL -Wl,--whole-archive lib/libavcodec.a -Wl,--no-whole-archive

所以基本上我只是创建一个共享库,其中大部分对象来自我自己的源代码(即 CMakeFiles/Valkka.dir/src/*.o),但其中一些来自外部静态库,位于“lib /libavcodec.a”。我收到以下错误:

/usr/bin/ld: lib/libavcodec.a(h264_cabac.o): relocation R_X86_64_PC32针对符号'ff_h264_cabac_tables'在制作共享对象时不能使用;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:错误:ld 返回 1 退出状态

但这太不真实了!我可以提取“libavcodec.a”

ar x libavcodec.a
Run Code Online (Sandbox Code Playgroud)

在那之后检查

readelf --relocs h264_cabac.o | egrep '(GOT|PLT|JU?MP_SLOT)' 
Run Code Online (Sandbox Code Playgroud)

确实给了一些**它:

00000000175d 003100000004 R_X86_64_PLT32 0000000000000000 __stack_chk_fail - 4 000000001926 0031000000004 R_000000006_4 000000000006_000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000心

...

就像

objdump -r h264_cabac.o | grep -i "relocation"
Run Code Online (Sandbox Code Playgroud)

因此,实际上,“libavcodec.a”中的目标文件已经被编译为获得 PIC(位置无关代码)。

为什么链接器不相信!?

相关链接:

如何在共享对象中包含存档的所有对象?

将档案 (.a) …

c++ linker ffmpeg shared-libraries static-libraries

7
推荐指数
1
解决办法
1312
查看次数

标签 统计

linker ×2

linux ×2

shared-libraries ×2

static-libraries ×2

archive ×1

c ×1

c++ ×1

ffmpeg ×1

gcc ×1