c++ - 在 Mac Yosemite 中设置系统范围路径

标签 c++ eclipse macos boost path

我已经安装了 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/

相关文章:

apache-flex - 使用 ANT 查找工作区位置

java - 保存裁剪后的图像后为 "Unable to resume activity"- Android

c++ - 当我不在 C++ 中包含字符串头文件时出错

c++ - 无法更改的指针为无法写入的指针?

java - 为什么以下代码会返回错误消息 The type Person is already Defined.类(class)人员有什么问题?

firefox - 如何使用 Selenium RC 关闭或最小化浏览器窗口?

C: clock() 在 Windows 和其他操作系统中的不同实现?

java - OS X 10.9 更新已停止 .apk jarsigner 工作

c++ - 如何为typedef定义隐式转换?

c++ - 我可以将/dev/sda用作普通的顺序文件吗?