我制作了一个成功调用某些dylib的应用程序(可执行文件),但是dylib文件和可执行文件位于不同的目录中。我将包含dylib文件的目录添加到$ PATH环境变量中,但是仍然无法加载。我将所有dylib文件复制到可执行文件,程序最终运行。这确认dylib文件没有问题。但是,如何告诉操作系统找到它?
在Windows中,我只需要将包含dll文件的目录路径添加到$ PATH。对于Mac OS X,我需要做什么?
非常感谢!
最佳答案
阅读Justin提供的链接后,我成功地使用@executable_path
token 将dylib install_name更改为指向可执行文件所在的目录。
我将举一个例子进行演示。
假设我有以下可执行文件/opt/local/bin/convert,其dylib在/opt/local/lib中。
我想将其复制到另一个目录,并使其从与复制可执行文件相同的目录加载其dylib。
> mkdir ~/tmp/bin
> cp /opt/local/bin/convert ~/tmp/bin
获取可执行文件dylib的列表
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
/opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
/opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
/opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
/opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
/opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
/opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...
我只关心/opt/local/lib目录中的dylib,因此我们只提取/opt中的dylib。我想保持所有其他dylib引用完整,尤其是对/usr/lib/libSystem的东西。
> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F' ' '{ print $1 }'`
将可执行文件引用的所有dylib复制到复制了可执行文件的目录中。
> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;
使用
install_name_tool
更改我们在上一步中拉出的所有dylib的安装名称,并通过在@executable_path
之前添加dylib名称来替换它们。这将使动态链接程序在与可执行文件所在的目录中查找dylib。> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;
确认安装名称已更改,并且libSystem仍指向/usr/lib/libSystem。
> otool -L ~/tmp/bin/convert
~/tmp/bin/convert:
@executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
@executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0)
@executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0)
@executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
@executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0)
@executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0)
@executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6)
@executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6)
...
关于c++ - 如何在Mac OS X(C++)中使用dylib,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4677044/