2016-07-31 118 views
1

我在Xcode一個項目,我在環境變量窗格中設置DYLD_FALLBACK_LIBRARY_PATH設置在我的程序應該尋找庫鏈接到(這對於我而言效果很好)如何設置dylib搜索路徑OSX

enter image description here

我在寫一個CMakeLists.txt文件來生成這個項目,我想從腳本中設置這個屬性。

我知道我能做到這一點:

SET(ENV{DYLD_FALLBACK_LIBRARY_PATH} ${DYLD_FALLBACK_LIBRARY_PATH} /path/to/lib) 

但是當我跑我得到這個錯誤:啓動應用程序時

'dyld: Library not loaded ... Reason: image not found' 

。我想象的聲明是不一樣的。

有人知道如何才能實現我從CMakeLists.txt中獲得的Xcode的等價物嗎?

我隱約知道CMake RPATH的東西,但我寧願避免,如果可能的話。

謝謝你的時間!

乾杯!

Tom

+2

'我隱約知道的CMake的RPATH的東西,但我寧願避免,如果可能的。 ' - 但這是做你想做的事的正確方法。有關更多信息,請參見https://cmake.org/Wiki/CMake_RPATH_handling。 'SET(ENV {..})'僅在'cmake'運行階段設置環境變量,它不會影響構建或運行階段的環境。 – Tsyvarev

+1

嗨!我應該強調vaugely ...:P我的情況是我有一個dylib(在這種情況下是SDL),我想在運行時鏈接,但我不想將其添加到系統路徑(/ usr /本地/斌..)我看了一下RPATH的東西,但它看起來都超級複雜。我已經閱讀了那篇文章,並嘗試了一些它所說的使用CMake的東西,但沒有太多的運氣。我必須執行dylib install_name_tool的事情嗎?我想避免這個,因爲它看起來有點奇怪。我的背景主要是Windows,所以也許我錯過了一些明顯的東西!謝謝! – Tom

+0

如果您在遵循有關RPATH的CMake文章時遇到問題,請描述具體問題。 – Tsyvarev

回答

3

我終於用這個稍微不同的方法得到了這個工作。這可能不是完美的解決方案,並且可以在所有情況下都能正常工作,但希望這可以幫助那些對我有類似問題的人。

我試圖鏈接到了該dylib libSDL2-2.0.0

如果我定位到該文件所在並運行:

otool -L libSDL2-2.0.0.dylib 

頂行我輸出得到的是這樣的:

/usr/local/lib/libSDL2-2.0.0.dylib 

如果我然後導航到我的內置可執行文件並運行相同的命令,我看到相同的東西:

/usr/local/lib/libSDL2-2.0.0.dylib 

(我的可執行文件鏈接到SDL)

我的問題是libSDL2-2.0.0.dylib實際上並不設在那裏,它在我的項目結構的libs文件夾中。爲了得到鏈接器在執行期間的lib,我不得不對dylib

install_name_tool -id "@executable_path/../path/to/lib/<lib_name>" <lib_name> 

其中@executable_path是運行應用程序的位置運行此命令 - 在我的情況下,這是 - build/debug

項目結構:

root/ 
    CMakeLists.txt 
    project/ 
     lib/ 
      libSDL2-2.0.0.dylib 
    build/ 
     debug/ 
      my_app 

這是爲了清楚準確的映射:

install_name_tool -id "@executable_path/../../project/lib/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib 

如果我運行otool -L libSDL2-2.0.0.dylib我現在看到:

@executable_path/../../sdl-test/lib/libSDL2-2.0.0.dylib 

輸出的第一行。

如果我現在再次構建我的項目(我只是在Xcode中構建),這會使用新的相對路徑更新我的應用程序到dylib。你只需要在庫上運行install_name_tool,你不必在你的可執行文件上運行它,它會在你編譯時更新。

如果我跑otool -L myapp我現在看到libSDL2-2.0.0.dylib

與相同相對路徑,啓動應用程序就能夠成功找到dylib的時候!

我的理解是,這是實現這一目標的OSX的方式,也沒有輝煌的替代

我希望這一直是一些幫助(比DYLD_FALLBACK_LIBRARY_PATH我在我的問題提到搞亂其他)給與我有類似困難的人!

資源,我發現有用:

http://osiris.laya.com/coding/dylib_linking.html

https://www.fmod.org/questions/question/forum-23398/

https://blogs.oracle.com/dipol/entry/dynamic_libraries_rpath_and_mac

UPDATE:

我居然找到一個更好的方式來做到這一點使用rpaths和思想我會寫出如何做這個以備將來參考:

在我的CMakeLists。txt文件,我添加了這些行權末(ADD_EXECUTABLETARGET_LINK_LIBRARIES後:

# set @rpaths for libraries to link against 
SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "${PROJ_LIB_DIR}") 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 

(見https://cmake.org/Wiki/CMake_RPATH_handling獲取更多信息)

其中${PROJ_LIB_DIR}是我的dylibs位於:

SET(PROJ_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}/lib) 

然後我跑了:

例如:

install_name_tool -id "@rpath/<my-dylib>.dylib" <my-dylib>.dylib 

實際:

install_name_tool -id "@rpath/libSDL2-2.0.0.dylib" libSDL2-2.0.0.dylib 
在我的dylib所在的目錄

(在我的情況libSDL2-2.0.0.dylib)

現在,當我運行cmake,然後建立我的項目,我的新的可執行文件將在運行時在CMakeLists.txt文件中設置的位置中搜索庫。 @rpath將與的CMakeLists.txt文件中指定的路徑被取代,一切都只是工作沒有明確不必設置@executable_path@loader_path