我在 XCode 中创建了一个 dylib。我将安装目录设置为@rpath。然后我创建了一个测试项目,我在其中使用了这个 dylib。当我运行它时,我得到 dyld 错误:库未加载....原因:找不到图像。
但是....如果我把那个 dylib 放在 /usr/lib 文件夹中,那么它就像一个魅力。
所以我的问题是,在编译这个 dylib 时有没有办法,我可以指定一些设置,这样它就不会在 /usr/lib 中查找,而只是查看它所在的位置(如果这有意义的话)?谢谢!
我在 XCode 中创建了一个 dylib。我将安装目录设置为@rpath。然后我创建了一个测试项目,我在其中使用了这个 dylib。当我运行它时,我得到 dyld 错误:库未加载....原因:找不到图像。
但是....如果我把那个 dylib 放在 /usr/lib 文件夹中,那么它就像一个魅力。
所以我的问题是,在编译这个 dylib 时有没有办法,我可以指定一些设置,这样它就不会在 /usr/lib 中查找,而只是查看它所在的位置(如果这有意义的话)?谢谢!
编辑:写完这个答案后,我重新阅读了你的问题。由于您只创建 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
我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)
这些下一行告诉库在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
这些行告诉库在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
这一切都来自我的 Xcode 项目中目标的运行脚本构建阶段。