我想使用改变可执行文件的rpathinstall_name_tool,但我无法弄清楚rpath现在是什么.install_name_tool需要在命令行上给出旧的和新的rpath.我可以使用什么命令在macOS下打印可执行文件的rpath?
我确实有一个需要链接的应用程序libjvm(来自JDK的库需要进行JNI绑定).当我告诉libjvm.dylib使用-L它的位置成功编译和链接.但是,当我运行二进制文件时,我得到:
dyld: Library not loaded: @rpath/libjvm.dylib
Referenced from: <my home directory>/./mybinary
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现我可以像我这样运行指定LD_LIBRARY_PATH的二进制文件:
LD_LIBRARY_PATH=<path to libfolder installation> ./mybinary
Run Code Online (Sandbox Code Playgroud)
但我当然不希望这样.如果每次启动应用程序时必须一次又一次地给它,我为什么还要指定确切的位置?!
我还了解到mac os x上的动态库确实得到了一种说明位置的印章.但是我不知道是什么rpath(对我来说似乎是变量,但如何在链接期间设置它?).
该应用程序是使用haskell构建的,但我同样可以手动链接目标文件ld.但是,我坚持使用那个rpath的东西 - 这对JDK库来说可能是特殊的吗?
这是我为了构建而做的事情:
ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre/lib/server -o mybinary
Run Code Online (Sandbox Code Playgroud) 相关,但不回答这个问题:
在OSX上,我有一个由打包管理器提供的动态库,安装在非标准目录中,install_name只是文件名.例如:
$ ROOT=$PWD
$ mkdir $ROOT/foo
$ cd $ROOT/foo
$ echo 'int foo(int a, int b){return a+b;}' > foo.c
$ clang foo.c -dynamiclib -install_name libfoo.dylib -o libfoo.dylib
Run Code Online (Sandbox Code Playgroud)
我不想改变(绝对路径,@ RPATH,...)libfoo.dylib的install_name使用install_name_tool -id.
现在我将程序与库链接,例如:
$ mkdir $ROOT/bar
$ cd $ROOT/bar
$ echo 'int foo(int,int); int main(){return foo(2,4);}' > main.c
$ clang main.c -L../foo -lfoo
Run Code Online (Sandbox Code Playgroud)
该程序无法运行:
$ ./a.out
dyld: Library not loaded: libfoo.dylib
Referenced from: $ROOT/bar/./a.out
Reason: image not found
Trace/BPT trap: 5
Run Code Online (Sandbox Code Playgroud)
因为:
$ otool -L ./a.out …Run Code Online (Sandbox Code Playgroud) R和Rust都可以与C代码接口,所以我认为这很有可能.但是,我对如何继续有点不清楚.
我已阅读这些部分寻找答案:
但是,虽然我精通,R但我不是一个系统程序员,并且对构建链看起来像这样的努力感到困惑.
使用Rinternals.h将是理想的,但我也会满足于更简单的.C界面.
我正在为Mac OS X(10.7.1)上的C++ 构建google-gflags命令行标记库.构建过程如下:
$ ./configure --prefix=output
$ make
$ make install
Run Code Online (Sandbox Code Playgroud)
我想在构建时更改生成的共享库的安装名称,install_name_tool之后不再使用.
默认情况下,生成的共享库的安装名称libgflags.dylib是输出路径:
$ otool -L ./output/libgflags.dylib
$ ./output/libgflags.dylib:
/tmp/gflags-1.5/output/lib/libgflags.0.dylib (compatibility version 2.0.0, current version 2.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.0.0)
Run Code Online (Sandbox Code Playgroud)
手册页ld(1)有一个-install_name选项,可用于在链接时更改动态库的安装名称.
例如,使用虚拟程序:
$ g++ -dynamiclib temp.cc -install_name /tmp/temp.dylib -o temp.dylib
$ otool -L temp.dylib
temp.dylib:
/tmp/temp.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version …Run Code Online (Sandbox Code Playgroud)