相关疑难解决方法(0)

如何在构建时修改.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
查看次数

在R中加载链接到Rust库的共享库

这里跟进这个问题,我在使用dyn.load加载链接到Rust dylib的共享库时遇到问题.我怀疑它与R在哪里寻找Rust dylib有关,但我没有找到一种方法来指定另一个位置而不是默认值.

从R开始,我执行以下操作:

> dyn.load('src/test.so')
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息:

Error in dyn.load("src/test.so") : 
  unable to load shared object '/Users/Zelazny7/r-dev/rustr/src/test.so':
  dlopen(/Users/Zelazny7/r-dev/rustr/src/test.so, 6): Library not loaded: libglue.dylib
  Referenced from: /Users/Zelazny7/r-dev/rustr/src/test.so
  Reason: image not found
Run Code Online (Sandbox Code Playgroud)

如何加载依赖于另一个共享库的共享库?

文件对于dyn.load没有规定如何做到这一点.

更新:

感谢shepmaster,我能够在R中成功构建和导入共享库.共享库是用C编译的,并且本身链接到Rust库.这些是我的步骤:

  1. 编译共享的Rust库
  2. 使用以下命令编译共享C库并链接到Rust库(在Windows中,因为我今天早上在工作)

我的目录内容:

C:\Users\gravesee\test>ls
rglue.dll  rglue.rs  rustr.c  treble.h
Run Code Online (Sandbox Code Playgroud)

编译最终的共享库:

gcc -shared -m64 -I"C:\Program Files\R\R-3.2.0\include" rustr.c -L"C:\Program Files\R\R-3.2.0\bin\x64" -lR -L. -lrglue -o test.dll
Run Code Online (Sandbox Code Playgroud)

在R中加载库:

> dyn.load("test.dll")
> is.loaded("triple")
[1] TRUE
> .Call("triple", as.integer(32))
The triple is 96
Run Code Online (Sandbox Code Playgroud)

r shared-libraries rust

7
推荐指数
1
解决办法
893
查看次数

标签 统计

shared-libraries ×2

autoconf ×1

install-name-tool ×1

macos ×1

r ×1

rust ×1