2015-09-30 81 views
0

我已經安裝了boost庫。我使用Eclipse來做一個簡單的boost項目。在Mac Yosemite中設置系統寬度路徑

#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; 
} 

我已經在此項目的屬性中設置了include文件夾和庫文件夾的路徑。但我得到一個運行時錯誤:dyld: Library not loaded: libboost_system.dylib。爲了解決這個問題,我去了run configuration並將環境變量DYLD_LIBRARY_PATH設置爲/Users/myName/Documents/Softwares/boost_1_59_0/stage/lib。這已經解決了我的問題。

我需要的是:我不想爲每個基於Boost的項目設置environment variable。因此,我試圖設置我的.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:此路徑設置問題,不只是只升壓,但我必須爲其他圖書館做類似的事情太多(如OpenCV的是建立/安裝在本地目錄)。

+0

您可以通過命令啓動GUI應用程序,例如'open -a Adob​​e \ Photoshop \ CS' – Krypton

+0

@Krypton:是的,那也可以。但我希望可以直接對路徑變量進行重新規範化。 – skm

回答

1

而不是像這樣添加系統範圍的路徑,您應該將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

原來,推動建立不設置庫的名稱,包括在安裝的名字,這意味着,即使你設定在構建的-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這應該可以幫助你得到一個在這種情況下工作的解決方案。

+0

把上面的代碼行拋出編譯時錯誤:'ld:unknown option:-Wl,-rpath,/ Users/myName/Documents/Softwares/boost_1_59_0/stage/lib' – skm

+0

聽起來像你的鏈接器是'ld'而不是編譯器驅動程序。在這種情況下,將其更改爲'-rpath/Users/myName/Documents/Softwares/boost_1_59_0/stage/lib'。如果你得到一個與最小的mac os版本相關的鏈接器錯誤,你還必須添加'-macosx_version_min 10.5'。刪除'-Wl'後的 – Petesh

+0

...我得到'ld:未知選項:-rpath,/ Users/myName/Documents/Softwares/boost_1_59_0/stage/lib'。沒有與Mac版本相關的錯誤。 – skm