静态链接 libpng 到共享库

2024-04-11

我已将问题简化为最小的 test.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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态链接 libpng 到共享库 的相关文章

随机推荐

  • Magento 一个订单可使用多个优惠券代码,无需延期

    我已经工作了 3 天 试图在一个订单中应用多个优惠券代码 我知道有可用的模块 但我不想投资购买模块 我想要一些自定义代码 以便我可以在单个订单中应用多个优惠券代码 要添加 2 个优惠券代码 我所做的是这样的 1 在 sales flat q
  • 如何让程序在ssh退出后继续运行? [复制]

    这个问题在这里已经有答案了 可能的重复 防止后台进程在关闭 SSH 客户端后停止 https stackoverflow com questions 285015 linux prevent a background process fro
  • 如何获取在 TreeView 控件中选择的所有父节点(直到根节点)?

    如果我有一个 TreeView myTreeview 如何获取所选节点的所有父节点 父节点 父节点的父节点等 的列表 我建议您创建一组自己的树助手 例如 下一个是针对您的问题的 public static class TreeHelpers
  • 在 Python 中标记一个保留分隔符的字符串

    有没有相当于str split在Python中也返回分隔符 在处理一些标记后 我需要保留输出的空白布局 Example gt gt gt s tthis is an example gt gt gt print s split this i
  • 使用 XML 命名空间前缀和指定 xmlns="blah" 作为属性之间的区别

    以下 xml 片段在命名空间方面有何区别 如果有 Form1
  • 如何在Python中使用保存模型进行预测

    我正在 python 中进行文本分类 我想在生产环境中使用它来对新文档进行预测 我正在使用 TfidfVectorizer 来构建 bagofWord 我在做 X train vectorizer fit transform clean d
  • 实体框架 4.1 设计器是否可以仅针对选定的实体“从数据库更新模型”?

    情况 有时 数据库模式并不是您所认为的系统信息的理想表示 并且您可能无法更改它 我们一直在使用实体框架创建一个更好的概念模型 以便在这种情况下进行编码 这意味着从数据库更新模型 然后通过设计器或直接使用文本编辑器直接通过 edmx 文件自行
  • Javascript 中的同步睡眠函数

    我想使用 JS JQuery 模拟进度条 这是我的 HTML 代码 p 0 p 我想从 0 到 100 并以慢动作看到 视觉上的进度 所以我真正需要的是一个 For 循环和一个暂停函数 但不幸的是没有类似睡眠的函数Javascript 第一
  • 将代码热交换到“mvnDebug tomcat:run”

    通常我使用启动tomcatmvnDebug tomcat run 代码更改后我需要使用mvn tomcat redeploy 这是次优的 因为我经常只更改现有方法体的内容 我可以将方法的主体热交换到运行时中 然后进行热重新部署作为后备吗 不
  • UITableView:我可以删除多行吗?

    我想根据用户的选择从表视图中删除多行 显然我不能使用didSelectRowAtIndexPath方法 因为它将为所选的每一行调用 我想让用户选择多行进行删除 然后一次性删除它们 是否可以 如果是 那么该怎么办呢 另外 我正在使用基于单视图
  • 如何配置 ASP.NET Core 1.0 以使用本地 IIS 而不是 IIS Express?

    我怎样才能设置一个 Net核心1 0项目使用本地IIS代替IIS 快递调试时 我尝试过修改启动设置 json以各种方式归档 例如 替换所有出现的IIS 快递 with 本地IIS并更新应用程序网址 and 启动网址使用我的自定义本地主机ht
  • 使用 DisplaCy 将 SpaCy 渲染文件保存为 SVG

    我有以下代码 import spacy from spacy import displacy from pathlib import Path nlp spacy load en core web sm parse True tag Tru
  • 为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用?

    如果我不回来会怎样din or dout 实际上我正在读一本书 其中作者返回了返回流引用 istream operator gt gt istream din vector a for int i 0 i
  • 主题应用程序中的样式 SnackBar

    我需要帮助 如何更改样式应用程序中小吃栏中文本的设计 我对代码的更改不感兴趣 我找到了以下代码 但这对我不起作用 这是为什么 我的主题源自 style Theme AppCompat Light DarkActionBar 我将非常感谢您的
  • 如何监控 DOM 的变化?

    有没有一种方法 使用 jQuery 或其他方式 来监视 DOM 的插入 删除 样式更新等 请参阅此处的 MutationEvent 元素 https developer mozilla org en DOM DOM event refere
  • 插件和主题之间的依赖冲突

    我在我的网站上安装了自定义主题和 SMTP 插件 它们都包含用于不同目的的 Google API PHP 客户端 不幸的是 插件和主题使用的依赖是不同版本的 并且它们无法轻松升级或降级 这会导致冲突 插件从主题加载包而不是自己的包 并抛出错
  • Axis HTTP 与 Axis HTTPS 代理设置

    我部署在 Weblogic 集群上的 Java 应用程序调用两个 Web 服务 如下所示 它通过 HTTPS 将 SOAP 客户端请求发送到互联网上的外部应用程序 通过 Axis 1 4 创建的 Java 类 此后 它通过 HTTP 将 S
  • 在 Erlang 中使用完全限定的函数调用?

    我刚刚学习了如何在 Erlang 中升级模块 并且我知道只有使用完全限定名称的函数调用 例如module function 重新链接 到加载到 VM 中的当前版本 但未指定模块名称的函数调用不会 重新链接 到当前版本 而是继续使用旧版本 关
  • Heroku 错误:找不到模块“./config/keys”

    我部署了一个 Nodejs 应用程序 到目前为止它的后端是 Heroku 我在浏览器中收到应用程序错误 当我跑步时heroku logs 我看到这个错误 Error Cannot find module config keys 所以我运行一
  • 静态链接 libpng 到共享库

    我已将问题简化为最小的 test c include png h int function printf ld long png create read struct 编译用 gcc shared fPIC test c o test so