查看/ usr/lib的XCode dylib

dfs*_*fsf 2 macos xcode frameworks objective-c dylib

我在XCode中创建了一个dylib.我将installtion目录设置为@rpath.然后我创建了一个测试项目,我正在使用这个dylib.当我运行它时,我得到dyld错误:库没有加载....原因:没有找到图像.

但是....如果我把那个dylib放在/ usr/lib文件夹中,那么它就像魅力一样.

所以我的问题是,有没有一种方法在编译这个dylib时,我可以指定一些设置,这样它就不会查看/ usr/lib并只查看它所在的位置(如果这有意义)?谢谢!

SSt*_*eve 5

编辑:我在写完这个答案后重新阅读了你的问题.由于您只是创建dylib而不是可执行文件,因此您只需要使用该install_name_tool -id命令.我不相信你可以告诉它自己寻找它自己的位置.我想你必须给它一条路.在此示例中,它查看应用程序包的Frameworks路径,这是一个非常合理的查找位置.


您必须更改应用程序查找文件的路径以及库期望找到的路径.这是我使用三个OpenCV库的示例.

这些第一行告诉应用程序在应用程序包的Frameworks文件夹中查找库.($BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH是指定可执行文件的环境变量的组合.)

#Fix references in executable
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
install_name_tool -change lib/libopencv_highgui.2.3.dylib @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH
Run Code Online (Sandbox Code Playgroud)

lib/libopencv_core.2.3.dylib先前运行了第一个参数()otool -L.

$ otool -L libopencv_imgproc.2.3.1.dylib 
libopencv_imgproc.2.3.1.dylib:
    lib/libopencv_imgproc.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    lib/libopencv_core.2.3.dylib (compatibility version 2.3.0, current version 2.3.1)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3)
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)
Run Code Online (Sandbox Code Playgroud)

这些下一行告诉库在Frameworks文件夹中查找自己.

#Fix install location in libraries
install_name_tool -id @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_core.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_imgproc.2.3.1.dylib
install_name_tool -id @executable_path/../Frameworks/libopencv_highgui.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib
Run Code Online (Sandbox Code Playgroud)

这些行告诉库在Frameworks文件夹中相互查找.

#Fix references in libraries
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_imgproc.2.3.1.dylib
install_name_tool -change lib/libopencv_core.2.3.dylib @executable_path/../Frameworks/libopencv_core.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib 
install_name_tool -change lib/libopencv_imgproc.2.3.dylib @executable_path/../Frameworks/libopencv_imgproc.2.3.1.dylib $BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH/libopencv_highgui.2.3.1.dylib
Run Code Online (Sandbox Code Playgroud)

这一切都来自我的目标在我的Xcode项目中的Run Script构建阶段.