I want to set under Mac OSX the runtime path of an executable (for the linker) at compile time, such that shared libraries at non-standard locations are found by the dynamic linker at program start.
Under Linux this is possible with -Xlinker -rpath -Xlinker /path/to
(or using -Wl,-rpath,/path/to
) and under Solaris you can add -R/path/to
to the compiler command line.
I found some information that Mac OS X gcc has -rpath support since 10.5, i.e. since ~ 2008.
I tried to get it working with a minimal example - without success:
$ cat blah.c
int blah(int b)
{
return b+1;
}
And:
$ cat main.c
#include <stdio.h>
int blah(int);
int main ()
{
printf("%d
", blah(22));
return 0;
}
Compiled it like this:
$ gcc -c blah.c
$ gcc -dynamiclib blah.o -o libblah.dylib
$ gcc main.c -lblah -L`pwd` -Xlinker -rpath -Xlinker `pwd`/t
Now the test:
$ mkdir t
$ mv libblah.dylib t
$ ./a.out
dyld: Library not loaded: libblah.dylib
Referenced from: /Users/max/test/./a.out
Reason: image not found
Trace/BPT trap
Thus the question: How to I set the runtime path for the linker under Mac OSX?
Btw, setting DYLD_LIBRARY_PATH
works - but I don't want to use this hack.
Edit: Regarding otool -L
:
$ otool -L a.out
a.out:
libblah.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
It seems that otool -L
only prints the library names (and probable the locations at link time) the executable was linked against and no runtime path information.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…