2016-07-31 114 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