gpt4 book ai didi

c - 静态链接 libpng 到共享库

转载 作者:行者123 更新时间:2023-11-30 14:53:52 25 4
gpt4 key购买 nike

我已将问题简化为最小的测试。c:

#include "png.h"

int function() {
printf("%ld", (long)png_create_read_struct);
}

编译

gcc -shared -fPIC test.c -o test.so -lm -l:libpng16.a

报错

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libpng16.a(pngread.o): relocation R_X86_64_PC32 against symbol `png_sRGB_table' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

现在我发现的这个错误的每个答案都可以归结为“按照它所说的去做并使用 -fPIC 重新编译”,但正如你所看到的,我已经在这样做了。那么什么给出了呢?

(上面的输出来自带有 libpng16 的 Ubuntu 17.10。带有 libpng12 的 Ubuntu 16.04 会导致类似的错误。)

最佳答案

使用 -fPIC 编译 libpng

user@user_pc:~/Documents$ mkdir libpng
user@user_pc:~/Documents$ cd libpng
user@user_pc:~/Documents/libpng$ wget https://download.sourceforge.net/libpng/libpng-1.6.37.tar.gz
user@user_pc:~/Documents/libpng$ tar xvfz libpng-1.6.37.tar.gz
user@user_pc:~/Documents/libpng$ cd libpng-1.6.37
user@user_pc:~/Documents/libpng/libpng-1.6.37$./configure --prefix=/home/user/Documents/libpng --with-pic=yes
user@user_pc:~/Documents/libpng/libpng-1.6.37$ sudo make

您的二进制文件位于~/Documents/libpng/libpng-1.6.37/lib中,最有趣的是libpng.a,它现在是使用-fPIC编译的。

它还解决了在 Linux 上将 Blender 编译为 Python 模块时出现的问题:

/usr/bin/ld.gold: error: /usr/lib/x86_64-linux-gnu/libpng.a(pngerror.o): requires dynamic R_X86_64_PC32 reloc against 'stderr' which may overflow at runtime; recompile with -fPIC
collect2: error: ld returned 1 exit status

关于c - 静态链接 libpng 到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com