我有一个简单的 C++ 程序,我试图运行该程序,该程序与我之前构建的 Boost.Thread 库的版本链接。我似乎无法理解运行时库路径在 OS X 上的行为方式。
由于我的 Boost 库没有RPATH 相对安装名称 https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html,我正在使用DYLD_LIBRARY_PATH
环境变量告诉动态链接器在哪里找到libboost_thread.dylib
在运行时。
如果我直接在我的(bash
) shell:
[~/git/project]$ echo $DYLD_LIBRARY_PATH
/Users/jasonr/git/project/boost/lib
[~/git/project]$ .sconf_temp/conftest_7
[~/git/project]$ # Program runs successfully; this is what I expect.
然而,该程序是作为一系列测试的一部分运行的autoconf
-类似我正在使用的框架。它使用以下命令在子 shell 中运行程序sh -c
。如果我尝试这样做,会发生以下情况:
[~/git/project]$ # Make sure the environment variable is exported to child shells.
[~/git/project]$ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH
[~/git/project]$ # Try to run it in a child shell.
[~/git/project]$ sh -c .sconf_temp/conftest_7
dyld: Library not loaded: libboost_thread.dylib
Referenced from: /Users/jasonr/git/project/.sconf_temp/conftest_7
Reason: image not found
Trace/BPT trap: 5
就好像环境变量没有传播到dyld
在这种情况下。为什么会出现这种情况呢?我更熟悉LD_LIBRARY_PATH
在 Linux 上,(我认为)应该适用于上面的示例。为了使这项工作成功,我还需要做其他事情吗?
据推测,您正在运行 El Capitan (OS X 10.11) 或更高版本。这是系统完整性保护的副作用。来自系统完整性保护指南:运行时保护 https://developer.apple.com/library/prerelease/mac/documentation/Security/Conceptual/System_Integrity_Protection_Guide/RuntimeProtections/RuntimeProtections.html文章:
当一个进程启动时,内核会检查主进程是否
可执行文件在磁盘上受保护或使用特殊系统签名
权利。如果任一为真,则设置一个标志来表示它
受到保护以防止修改。 ……
…任何动态链接器(dyld
)
环境变量,例如DYLD_LIBRARY_PATH
,被清除时
启动受保护的进程。
所有系统提供的口译员,包括/bin/sh
,以这种方式受到保护。因此,当您调用sh
,所有 DYLD_* 环境变量都被清除。
您可以编写一个 shell 脚本来设置DYLD_LIBRARY_PATH
然后执行.sconf_temp/conftest_7
。您可以使用 shell 解释器来执行它(实际上,您必须这样做)并且环境变量会很好,因为清除是在启动受保护的可执行文件时发生的。基本上,这种方法类似于您问题中的工作示例,但封装在 shell 脚本中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)