将libpng静态链接到共享库 [英] Static link libpng into a shared library

查看:20
本文介绍了将libpng静态链接到共享库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已将问题简化为以下最小测试。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重新编译",但正如您所看到的,我已经在这样做了。那是什么原因呢?

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

推荐答案

现在,我找到的这个错误的所有答案都可以归结为"照它说的做并使用-fPIC重新编译",但正如您所看到的,我已经在这样做了。那是什么原因呢?

正如我所评论的,不,事实上您还没有已经在这样做了。链接器希望从libpng16.a链接的对象是PIC,但它们不是。这就是它希望您使用-fPIC重新编译的

虽然可以将PIC对象存储在常规存档中,如libpng16.a,但这是非常规的。这些文件通常被称为"静态库",这并非没有原因。它们通常用于支持构建静态二进制文件,而不是共享的二进制文件,而PIC对象并不能实现这一目的。您不应期望标准包提供的任何此类档案包含PIC对象。

在任何情况下,由于您正在构建一个共享库,自然和适当的做法是链接到libpng的共享版本。您尝试链接静态库时遇到了一些麻烦,但原因尚不清楚。无论你试图完成什么,这都是错误的方式,即使这是一件值得完成的事情。

这篇关于将libpng静态链接到共享库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆