我已经安装了 boost 库。我正在使用 Eclipse 制作一个简单的 boost 项目。
#include <stdio.h>
#include <boost/filesystem.hpp>
int main() {
boost::filesystem::path path("/Users/schoen"); // random pathname
bool result = boost::filesystem::is_directory(path);
printf("Path is a directory : %d\n", result);
return 0;
}
我已经在这个项目的properties中设置了include文件夹和library文件夹的路径。但是我遇到了一个运行时错误:dyld: Library not loaded: libboost_system.dylib
。为了解决这个问题,我转到运行配置
并将环境变量DYLD_LIBRARY_PATH
设置为/Users/myName/Documents/Softwares/boost_1_59_0/stage/lib
。这解决了我的问题。
我需要什么:我不想为每个基于 Boost 的项目设置环境变量
。因此,我尝试设置我的 .bash_profile
。我在 .bash_profile
中写了以下几行。
# Following lines are for Boost Library
DYLD_LIBRARY_PATH=/Users/myName/Documents/Softwares/boost_1_59_0/stage/lib
export DYLD_LIBRARY_PATH
问题: 通过在 .bash_profile
中设置变量,我可以通过终端运行我的程序。如果我通过终端打开 IDE(例如 Eclipse)然后运行该应用程序,该程序也会运行。显然,.bash_profile
可以为终端应用程序设置变量。 如何为窗口应用程序设置路径?
PS:这个路径设置问题不仅仅针对Boost,我也必须对其他库做类似的事情(比如在本地目录中构建/安装的OpenCV)。
最佳答案
与其添加这样的系统范围路径,不如将 rpath 添加到依赖于 boost 的应用程序的库中。要添加 rpath
选项,您可以执行 Project Properties
-> C/C++ Build
-> Settings
-> Miscellaneous
并在链接器标志中添加:
-Wl,-rpath,/Users/myName/Documents/Softwares/boost_1_59_0/stage/lib
(例如,如果您的链接器是 g++
或 clang++
)
如果你的链接器是显式的ld
,那么选项是
-rpath /Users/myName/Documents/Softwares/boost_1_59_0/stage/lib
虽然您可能需要添加 -macos_version_min 10.5
(或更新版本 - 可能是 10.8 - 这取决于您构建的操作系统)。
这将导致任何构建的应用程序在那里搜索库以及默认位置。
Although a location like that to me looks a bit volatile
事实证明,boost 构建没有将库名称设置为在安装名称中包含 @rpath
,这意味着即使您在构建中设置了 -rpath
,因为在 @rpath
中没有提到这些库,所以它不会在运行时找到它们。一个解决方法是明确设置 boost 库的安装名称,以及它们对自己库的内部引用:
#!/bin/bash -p
for i in *.dylib; do
# set the rpath
install_name_tool -id @rpath/$i $i
for lib in $(otool -L $i | grep libboost | awk '{print $1}'); do
if [[ -f $lib ]]; then
install_name_tool -change $lib @rpath/$lib $i
fi
done
done
这意味着链接到这些 boost 库的二进制文件将遵循 rpath 设置。
您可以对其他库重复类似的过程,以确保它们遵守 rpath。关键元素是 install_name_tool -id "@rpath/libstuff.dylib"libstuff.dylib
,它表示当您链接到库时记录对 @rpath/libstuff.dylib< 的引用
。如果图书馆还没有这套。
其次,对于依赖库的内部引用,-change
选项将对绝对名称的引用更改为 rpath 相对名称,例如install_name_tool -change "libstuff.dylib""@rpath/libstuff.dylib"libdependsonlibstuff.dylib
。这甚至可以在链接的二进制文件上执行。
如果你还想设置环境变量,there are some options available这应该可以帮助您获得适用于这种情况的解决方案。
关于c++ - 在 Mac Yosemite 中设置系统范围路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863343/