Jas*_*n R 7 macos bash shell environment-variables
我有一个简单的C++程序,我正在尝试运行,它与我之前构建的Boost.Thread库的版本相关联.我似乎无法理解运行时库路径在OS X上的行为方式.
由于我的Boost库没有与RPATH相关的安装名称,因此我使用DYLD_LIBRARY_PATH环境变量来告诉动态链接器libboost_thread.dylib在运行时的位置.
如果我直接在my(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.
Run Code Online (Sandbox Code Playgroud)
但是,这个程序是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
Run Code Online (Sandbox Code Playgroud)
就像dyld在这种情况下环境变量没有传播到一样.为什么会这样?我更熟悉LD_LIBRARY_PATHLinux 上的行为,我认为它应该适用于上面的例子.为了使这项工作,还有什么我需要做的吗?
Ken*_*ses 12
据推测,您正在运行El Capitan(OS X 10.11)或更高版本.这是系统完整性保护的副作用.从" 系统完整性保护指南:运行时保护"一文中:
当进程启动时,内核会检查主要可执行文件是在磁盘上受保护还是使用特殊系统权利进行签名.如果其中任何一个为真,则设置一个标志以表示它受到保护以免被修改....
... 启动受保护的进程时,将清除任何动态的linker(
dyld)环境变量,例如DYLD_LIBRARY_PATH.
所有系统提供的解释器(包括/bin/sh)都以这种方式受到保护.因此,在调用时sh,将清除所有DYLD_*环境变量.
您可以编写一个shell脚本来设置DYLD_LIBRARY_PATH然后执行.sconf_temp/conftest_7.您可以使用shell解释器来执行 - 实际上,您必须 - 并且环境变量也没问题,因为在启动受保护的可执行文件时会发生清除.基本上,这种方法类似于您的问题中的工作示例,但封装在shell脚本中.