【发布时间】:2018-02-05 13:58:34
【问题描述】:
我正在尝试运行一个简单的 C++ 程序,该程序与我之前构建的 Boost.Thread 库的版本相关联。我似乎无法理解运行时库路径在 OS X 上的行为方式。
由于我的 Boost 库没有 RPATH-relative install name,我使用 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 的框架作为一系列测试的一部分运行的。它使用sh -c 在子shell 中运行程序。如果我尝试这样做会发生以下情况:
[~/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 上的行为,(我认为)应该适用于上述示例。为了完成这项工作,我还需要做些什么吗?
【问题讨论】:
标签: macos bash shell environment-variables