3

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

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

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

4

1 回答 1

6

编辑:写完这个答案后,我重新阅读了你的问题。由于您只创建 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 项目中目标的运行脚本构建阶段。

于 2011-08-24T04:57:51.290 回答