How to set the runtime path (-rpath) of an executable with gcc under Mac OSX?

匿名 (未验证) 提交于 2019-12-03 08:30:34

问题:

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   int blah(int);  int main () {   printf("%d\n", 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.

回答1:

Found by experimentation, and inspecting the command lines generated by Xcode for a reference rpath demo project by Dave Driblin:

otool -L shows you the install name of the linked libraries. To get @rpath to work, you need to change the install name of the library:

$ gcc -dynamiclib blah.o -install_name @rpath/t/libblah.dylib -o libblah.dylib $ mkdir t ; mv libblah.dylib t/ $ gcc main.c -lblah -L`pwd`/t -Xlinker -rpath -Xlinker `pwd` 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!