在 Linux 上编译一个共享库以面向所有发行版

2024-02-06

我们希望创建一个共享库 (.so) 以针对所有发行版,包括旧发行版。该代码是用 C++ 编写的,并使用 C++11 功能,因此编译器必须至少为 gcc 4.7。 我们注意到,如果我们在安装了 gcc 4.7.2 的 Linux 机器(例如 Ubuntu 12.10)上编译代码,那么生成的 .so 具有“版本 1 (GNU/Linux)”,而在较旧的操作系统(例如 CentOS 5.6)上版本是“版本 1 (SYSV)”——GNU/Linux 较新版本的库不能在较旧的操作系统上使用。

因此,我们尝试了在 CentOS 5.6 机器上安装 gcc 4.7 的方法,用这个编译器编译我们的代码,并与 libstdc++ (-static-libstdc++) 静态链接 – 这生成了一个可在我们发现的每个 Linux 上使用的 .so。

这对于 32 位来说效果很好。然而,当我们在 64 位操作系统 (CentOS) 上采用相同的方法时,这会失败,并出现错误,即我们尝试链接到的现有 libstdc++.a 是在没有 –fPIC 的情况下编译的。

因此,我们尝试使用“–with-pic”选项编译 gcc 4.7.2 源代码,但无法链接到新的 libstdc++.a – 错误是:

/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld: /usr/local/lib/libFoo.so: 找不到符号 _ZNSs7_M_copyEPcPKcm@GLIBCXX_3 的版本节点。 4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:无法设置动态部分大小:错误值 collect2:错误:ld 返回 1 退出状态

我们在 google 上搜索到,使用 –fPIC 编译 libstdc++ 可能会出现问题,但为什么它适用于 32 位操作系统而不适用于 64 位操作系统呢?是否有另一种建议的方法来为所有 Linux 发行版创建一个 .so ?


我在以下位置回答了这个问题https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html https://gcc.gnu.org/ml/libstdc++/2014-05/msg00107.html

这看起来像https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54482所以可能会在 GCC 4.7.3 中修复(但我不确定)

...

x86 和 x86_64 的 PIC 实现方式不同,因为 64 位模式 对其有内置支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux 上编译一个共享库以面向所有发行版 的相关文章

  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • GCC 如何运行其他程序?

    也许标题并没有那么准确地表达问题 我知道当我跑步时gcc foo cGCC 调用其他为其完成所有工作的子程序 使 gcc 主程序只是一个接口 但这到底是如何完成的呢 是否使用system or exec或者其他一些功能 我之所以想知道这个是
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • AWS ALB 中基于路径的路由到具有多个端口的单个主机

    我想创建一个 ALB 它应该根据到不同网站的路径路由我的流量 例如 example com apple 应该转到 8080 example com grapes 应该转到 8180 example com oranges 应转到 8280
  • Rails 4 simple_form has_many 通过复选框不保存

    我正在尝试使用 simple form 通过复选框来实现员工经常性扣除表 我的代码有效 但所选的经常性扣除未保存在我的表中 我不明白为什么 这是我的模型 class Employee lt ActiveRecord Base belongs
  • 使用 maven-nar-plugin 在 Maven 中构建 C++ 项目

    有人使用 maven nar plugin 为不同平台 使用不同编译器构建 C 代码吗 如果有人请给我更多有关此的信息 我只是想知道如何使用 Maven 为不同平台构建 NAR 文件 我知道 为了能够在特定平台上构建项目 您应该在该平台上运
  • 在 Azure Functions 项目(.NET 标准 2.0)本地中找不到工作职能

    我正在尝试在 NET 标准 2 0 中创建一个 Azure Functions 项目 因为我需要在该项目中使用 NET 标准 2 0 类库 但是 当我尝试创建一个简单的 Azure Functions 项目并在本地运行它时 出现以下错误 h
  • em 中的媒体查询不受基本字体大小的影响

    我试图理解为什么设置不同的基本字体大小不会影响媒体查询的 EM 值 它们的默认基本字体大小为 16px 而其余内容反应正常 自己尝试一下 PX 中的媒体查询 https jsfiddle net sebtp n8x0tuvq 5 https
  • 输出导致与正则表达式不匹配的第一个字符

    是否可以输出导致与正则表达式不匹配的字符串 其索引 中的第一个字符 是否可以仅使用正则表达式匹配操作 或者必须使用更复杂的操作 例如 在 JavaScript 中 我可能有一个正则表达式 d 3 s d 2 匹配包含 3 位数字后跟空格和另
  • Android 中使用 xml 自定义形状

    我正在尝试绘制一个自定义形状 可以将其用作布局的背景 但我不能这样做 是否可以使用 android xml 中的 xml 绘制如下形状 我不知道如何从矩形的垂直中心切割半圆形 Use layer list制作这个自定义形状drawable
  • 无序对集合,编译错误

    我正在尝试创建一组无序的对 到目前为止我有 typedef std pair
  • 如何为子域配置 Facebook 应用程序

    我正在构建一个多租户应用程序 并且我挣扎将 Facebook 登录合并到 Web 应用程序中 例如 租户正在使用子域 http tenant 1 domain com http tenant 2 domain com http tenant
  • 如何识别STATUS_INVALID_CRUNTIME_PARAMETER异常

    平台是Windows 7 SP1 我最近花了一些时间调试由于代码将无效参数传递给 安全 CRT 函数之一而引起的问题 结果 我的应用程序立即中止 没有任何警告或任何内容 甚至没有崩溃对话框 起初 我尝试通过将 Windbg 附加到我的应用程
  • Chrome 浏览器 61v。单击可见区域之外的元素时出现问题

    当我将 Chrome 浏览器更新到 61v 时 单击可见区域之外的不可见元素会出现问题 早些时候它起作用了 尝试点击可见区域之外的链接 element Click 有 InvalidOperationException 元素在点 1134
  • 如何使信号 NaN 易于使用?

    IEEE754 标准定义了两类 NaN 安静 NaN QNaN 和信令 NaN SNaN 当 SNaN 加载到浮点寄存器时 浮点单元会引发异常 QNaN 可通过名为的常量用于 Delphi 代码NaN声明于Math 该常数的定义是 cons
  • Hibernate c3p0 连接池未超时空闲连接

    我们有一个 java 服务器连接到 MySQL 5 数据库 使用 Hibernate 作为持久层 该持久层使用 c3p0 进行数据库连接池 我尝试遵循 c3p0 和 hibernate 文档 Hibernate 如何配置 c3p0 连接池
  • 通过 Chrome 扩展模拟点击页面上的元素?

    我需要迭代并单击该类的所有元素 star gray在页面上 并在重定向后保持迭代和单击 运行JavaScript代码无法满足第二个要求 所以我打算写一个Chrome扩展 但我未能通过扩展模拟网页上的点击事件 我的项目如下 清单 json m
  • 从 GitHub 进行 Git 克隆后,我看不到我的分支

    我在 GitHub 上有一个存储库 它包含master和一个分支 当我克隆它时 我只获得master并没有看到我的分支 为什么会这样呢 如何查看存储库中的所有分支 默认情况下 git clone只创建一个分支 当前签出的分支 通常是 mas
  • 控制台窗口立即消失[重复]

    这个问题在这里已经有答案了 使用 C 的 Visual Studio 中的控制台窗口不稳定 ReadLine 也不工作 窗口立即消失 我看不到结果 您需要在代码后添加以下行 Console ReadKey 这将阻止控制台执行下一行 直到您按
  • 如何监控 OmniThreadLibrary 中的 Pipeline 阶段?

    是否可以以某种方式监控管道任务 我尝试像这样向每个任务添加监视器 FPipeline Parallel Pipeline Stage StageWorker1 Parallel TaskConfig MonitorWith MyMonito
  • 创建自定义凸路径Android

    我希望为我的框架布局设置一个自定义形状 矩形每个角的不同半径 以便框架布局中的视图将剪辑到形状的边界 ViewOutlineProvider provider new ViewOutlineProvider Override public
  • 通过客户端存根访问 WSDL 时出现 Java InaccessibleWSDLException

    我正在尝试为 Exchange Web 服务编写自定义 Java 客户端 我已经使用生成了客户端存根wsimport工具如所解释here http java dzone com articles jax ws hello world来自 E
  • 在 Linux 上编译一个共享库以面向所有发行版

    我们希望创建一个共享库 so 以针对所有发行版 包括旧发行版 该代码是用 C 编写的 并使用 C 11 功能 因此编译器必须至少为 gcc 4 7 我们注意到 如果我们在安装了 gcc 4 7 2 的 Linux 机器 例如 Ubuntu