如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)?

2024-01-06

我想在 Mac OSX 下在编译时设置可执行文件(对于链接器)的运行时路径,以便动态链接器在程序启动时找到非标准位置的共享库。

在 Linux 下,这可以通过-Xlinker -rpath -Xlinker /path/to(或使用-Wl,-rpath,/path/to)并且在 Solaris 下您可以添加-R/path/to到编译器命令行。

I found 一些信息 http://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_macMac OS X gcc 从 10.5 开始(即从 2008 年左右)开始支持 -rpath。

我试图用一个最小的例子让它工作 - 但没有成功:

$ cat blah.c 
int blah(int b)
{
  return b+1;
}

And:

$ cat main.c 

#include <stdio.h>

int blah(int);

int main ()
{
  printf("%d\n", blah(22));
  return 0;
}

像这样编译它:

$ gcc -c  blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd`  -Xlinker -rpath -Xlinker `pwd`/t

现在测试:

$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
  Referenced from: /Users/max/test/./a.out
  Reason: image not found
Trace/BPT trap

因此问题是:如何在 Mac OSX 下设置链接器的运行时路径?

顺便说一句,设置DYLD_LIBRARY_PATH有效 - 但我不想使用这个黑客。

Edit:关于otool -L:

$ otool -L a.out 
a.out:
        libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)

看起来otool -L仅打印可执行文件所链接的库名称(以及可能的链接时位置),并且不打印运行时路径信息。


通过实验发现,并检查 Xcode 生成的命令行是否有参考 Dave Driblin 的 rpath 演示项目 http://www.dribin.org/dave/blog/archives/2009/11/15/rpath/:

otool -L显示链接库的安装名称。要得到@rpath要工作,您需要更改库的安装名称:

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib
$ mkdir t ; mv libblah.dylib t/
$ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)? 的相关文章

随机推荐

  • 是否可以在没有 qmake 的情况下使用 Qt Creator?

    我听说可以使用 Qt Creator 构建非 Qt 应用程序 例如简单的 C HelloWorld 我下载并安装了 Qt Creator 并尝试用它编译简单的代码 但我没有成功 Creator 需要 qmake 来创建 makefile 虽
  • Docker 仅向主机公开端口

    docker 是否能够仅向主机公开端口而不向外部公开端口 我需要让 docker 与 mongo 数据库一起运行 并且我希望它只能从主机访问 但我需要链接主机端口 27017 这可能吗 或者唯一可能的方法是更改 防火墙定义 当然可以 只需将
  • 在标签android中添加片段的最佳方法是什么

    我的应用程序有一个底部导航栏 其中有 5 个选项卡 所以根据这些选项卡 我有 5 个片段 当我单击选项卡时 片段会根据该选项卡发生变化 我可以使用方法 beginTransaction replace 来切换片段 我不希望每次切换选项卡时都
  • django 管理页面和 JWT

    我们使用 django rest framework 和 django rest framework jwt 进行身份验证 它可以在除 django 管理页面之外的任何地方使用ip port admin 那仍然需要用户名和密码 是否有设置或
  • Maven 测试无法使用 Spring Boot 2.2 和 JUnit 5 运行 Cucumber 场景

    我正在 Spring Boot 2 2 6 上尝试 JUnit 5 和 Cucumber 并且在我的应用程序中需要 BDD 场景和单元测试 我已经创建了一个虚拟 ping 控制器对应的功能文件 一切正常 我运行时不会调用黄瓜测试mvn cl
  • Ruby 奇怪的错误

    每当我需要 ruby 或 irb 中的文件时 我都会收到此错误 LoadError no such file to load insert any filename rb from
  • 隐藏特定表的第 n 个子级

    我在一页上有两个表格 我该如何解决第二个问题 id tapp 运行显示 隐藏第 n 个子函数 我无知地尝试通过将 id 引用添加到开头来解决特定的表 td nth child var x document getElementById ta
  • 通过 PHP 从内容配置中提取文件名

    我需要一个正则表达式从以下字符串中提取文件名 包括文件扩展名 attachment filename UTF 8 test rar 或者像这样 attachment filename UTF 8 Epost 20 test part01 r
  • Apollo / GraphQl - 类型必须是输入类型

    向大家致以我正在学习的过程 并将 Apollo 和 graphQL 集成到我的一个项目中 到目前为止一切顺利 但现在我正在尝试进行一些突变 并且在输入类型和查询类型方面遇到了困难 我觉得事情比应有的复杂得多 因此我正在寻求有关如何处理我的情
  • 用宏连接字符串[重复]

    这个问题在这里已经有答案了 可能的重复 C语言中连接两个字符串的宏 https stackoverflow com questions 2191316 macro for concatenating two strings in c 如何用
  • MSAccess 2010 VBA 打开只读数据库

    我有一个 MS Access 数据库 我试图将存档数据从位于只读文件夹中的另一个 MS Access 数据库中提取出来 所以 Dim aidbx As DAO Database Dim stDB as STring stDB path to
  • Java / JPA 程序员的 Oracle 将空字符串视为 NULL 问题

    如何处理 Oracle 在数据库中将空字符串存储为 null 的情况 我希望它存储为空字符串 因为它不是 NULL 因为发出查询会更容易 像这样的事情会选择空字符串和非空字符串 但不会选择空值 select from mytable whe
  • 如何读取gcs存储桶中的文件内容

    我想打印 GCS 存储桶中文件中存在的数据 根据我的要求 文件不应下载到本地系统 但代码应直接从 gcs 存储桶本身读取代码 由于我的文件大小很大 我不希望将文件下载到本地系统 下面是我正在尝试的代码 但我没有得到预期的输出 import
  • 来自 CMake 的 Nuget 包

    我正在使用 CMake 生成 C WPF 项目 我遵循了这个 CMakeLists txtexample https github com bemehiser cmake csharp wpf example blob master Exa
  • 使用 subprocess.run 在 Windows 上运行进程

    我希望通过 Python 运行以下非常冗长的 shell 命令 C Users Alex Desktop tableexporter WGTableExporter exe E Steam Games Installed Directly
  • python'float'对象不能被解释为整数

    import numpy as np def romberg f l val np zeros l for i in range 0 l h 2 1 i N 2 h val i trapez f h N return val def tra
  • 高图表中的不连续数据集

    这是我尝试加载的两种类型的数据集 根据下拉组合还有更多类型的数据集 这些是 14 天的数据集 也是 14 24 小时的每小时级别 这两种类型的数据集是 1 连续 7 8 2014 0 00 9442 7 9 2014 0 00 8492 7
  • 从 data.frame 中采样,同时控制比例 [分层采样]

    我有以下数据集 id1 lt c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 status lt c 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2
  • Playwright 框架:有没有一种方法可以在 playwright 中执行依赖测试?

    Playwright 框架 有没有一种方法可以在 playwright 中执行依赖测试 例如 我们使用 TestNg 注释的 取决于 方法 或在 Selenium Webdriver 中使用 Priority 注释 我有一个依赖于其他测试用
  • 如何在 Mac OSX 下使用 gcc 设置可执行文件的运行时路径(-rpath)?

    我想在 Mac OSX 下在编译时设置可执行文件 对于链接器 的运行时路径 以便动态链接器在程序启动时找到非标准位置的共享库 在 Linux 下 这可以通过 Xlinker rpath Xlinker path to 或使用 Wl rpat