Related, but do not answer the question:
On OSX, I have a dynamic library provided by
I've been hitting my head against this for some time and think I have finally figured out how to do this without using install_name_tool
, at least for Mac OS 10.9 and later (as far as I've tested).
While you may have already figured this out, I'm posting it here in case anyone else needs it.
Basically you have two options:
install_name
in terms of @executable_path
ROOT=$PWD
mkdir $ROOT/foo
mkdir $ROOT/bar
cd $ROOT/foo
echo 'int foo(int a, int b){return a+b;}' > foo.c
clang foo.c -dynamiclib -install_name @executable_path/../foo/libfoo.dylib -o libfoo.dylib
cd $ROOT/bar
echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
clang main.c -L../foo -lfoo -o main
./main
echo $?
# output is '6'
@rpath
, which you then set when you compile the executable:ROOT=$PWD
mkdir $ROOT/foo
mkdir $ROOT/bar
cd $ROOT/foo
echo 'int foo(int a, int b){return a+b;}' > foo.c
clang foo.c -dynamiclib -install_name @rpath/libfoo.dylib -o libfoo.dylib
cd $ROOT/bar
echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
clang main.c -L../foo -lfoo -rpath @executable_path/../foo/ -o main
./main
echo $?
# output is '6'
The end result will be the same in both cases:
bar $ otool -L main
main:
@executable_path/../foo/libfoo.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
The second one is probably preferable, since then you can compile the library once, and have any executable that uses it define where it will load it from using its own rpath
.
Please check here for detailed explanations of @executable_path
, @rpath
and @load_path
(which I did not use here).