我終於用這個稍微不同的方法得到了這個工作。這可能不是完美的解決方案,並且可以在所有情況下都能正常工作,但希望這可以幫助那些對我有類似問題的人。
我試圖鏈接到了該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_EXECUTABLE
和TARGET_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
'我隱約知道的CMake的RPATH的東西,但我寧願避免,如果可能的。 ' - 但這是做你想做的事的正確方法。有關更多信息,請參見https://cmake.org/Wiki/CMake_RPATH_handling。 'SET(ENV {..})'僅在'cmake'運行階段設置環境變量,它不會影響構建或運行階段的環境。 – Tsyvarev
嗨!我應該強調vaugely ...:P我的情況是我有一個dylib(在這種情況下是SDL),我想在運行時鏈接,但我不想將其添加到系統路徑(/ usr /本地/斌..)我看了一下RPATH的東西,但它看起來都超級複雜。我已經閱讀了那篇文章,並嘗試了一些它所說的使用CMake的東西,但沒有太多的運氣。我必須執行dylib install_name_tool的事情嗎?我想避免這個,因爲它看起來有點奇怪。我的背景主要是Windows,所以也許我錯過了一些明顯的東西!謝謝! – Tom
如果您在遵循有關RPATH的CMake文章時遇到問題,請描述具體問題。 – Tsyvarev