问题
I am developing a Cocoa Application using the latest version of Xcode 4, I want to link dynamic libraries to my project (dylibs).
I read somewhere that adding the libraries in my project was not enough as I have to run install_name_tool and otool to make my project use the libraries that were bundled in my project.
I have read the manual pages for install_name_tool, but I do not understand WHY I have to do this.
How do libraries work? Especially interested in the part where the application and the libraries have paths that point to specific places in my machine, like /usr/local/lib/mylibrary.dylib when running otool -L
回答1:
Apple has several ways of locating shared libraries:
@executable_path: relative to the main executable@loader_path: relative to the referring binary@rpath: relative to any of a list of paths.
@rpath is the most recent addition, introduced in OS X 10.5.
If for instance you want to have your executable in Contents/MacOS and libraries in Contents/Libraries you could do the following:
install_name_tool -id @rpath/Libraries/lib_this.dylib builddir/lib_this.dylib
and in the top-level executable set rpath with:
install_name_tool -add_rpath @loader_path/.. myexecutable
and:
install_name_tool -change builddir/lib_this.dylib @rpath/Libraries/lib_this.dylib myexecutable
Note: that the first path after -change must match exactly what is currently in the binary.
If you get lost otool -l -v myexecutable will tell you what load commands exactly are currently in the executable.
See man dyld and man install_name_tool for more information.
回答2:
There is also a GUI tool named MacDependency which will expose all dependent libraries (https://github.com/kwin/macdependency/).
来源:https://stackoverflow.com/questions/9263256/why-is-install-name-tool-and-otool-necessary-for-mach-o-libraries-in-mac-os-x