相关疑难解决方法(0)

在macOS上打印可执行文件的rpath

我想使用改变可执行文件的rpathinstall_name_tool,但我无法弄清楚rpath现在是什么.install_name_tool需要在命令行上给出旧的和新的rpath.我可以使用什么命令在macOS下打印可执行文件的rpath

macos terminal command-line darwin dynamic-linking

68
推荐指数
3
解决办法
3万
查看次数

在Mac OS X中链接动态库(libjvm.dylib)(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)

macos java-native-interface linker haskell ghc

11
推荐指数
1
解决办法
8360
查看次数

clang,在链接时更改依赖的共享库安装名称

相关,但不回答这个问题:

在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)

macos install-name-tool dynamic-library

10
推荐指数
1
解决办法
4958
查看次数

将R对象传递给Rust程序需要哪些步骤?

R和Rust都可以与C代码接口,所以我认为这很有可能.但是,我对如何继续有点不清楚.

我已阅读这些部分寻找答案:

  1. R-extensions系统和外语接口
  2. Rust外部函数接口指南

但是,虽然我精通,R但我不是一个系统程序员,并且对构建链看起来像这样的努力感到困惑.

使用Rinternals.h将是理想的,但我也会满足于更简单的.C界面.

r rust

9
推荐指数
2
解决办法
673
查看次数

如何在构建时修改.dylib的安装名称

我正在为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)

macos autoconf shared-libraries install-name-tool

7
推荐指数
2
解决办法
7747
查看次数