如何设置dylib搜索路径OSX
我在Xcode一个项目,我在环境变量窗格中设置DYLD_FALLBACK_LIBRARY_PATH设置在我的程序应该寻找库链接到(这对于我而言效果很好)如何设置dylib搜索路径OSX
我在写一个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
我终于用这个稍微不同的方法得到了这个工作。这可能不是完美的解决方案,并且可以在所有情况下都能正常工作,但希望这可以帮助那些对我有类似问题的人。
我试图链接到了该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