r - 如何强制 ld 链接到静态库

标签 r linux linker linker-flags

我正在尝试创建一个共享库对象(将使用 dlopen 加载到 R 中),该对象链接到第三方库的静态版本而不是动态版本。 (目标是拥有一个而不是两个用户需要移动到位的共享库。)

这是用于链接最终可执行文件的调用:

gcc -std=gnu99 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -flto=auto -Wl,-z,relro -o RNetica.so Cases.o Continuous.o Edges.o Experience.o Inference.o Networks.o Node.o Random.o Registration.o Session.o -dn -L/home1/ralmond/Projects/RNetica/src/Netica/Netica_API_607/lib -lnetica -dy -lstdc++ -L/usr/lib/R/lib -lR

这会产生 libRNetica.so它被设计为使用 dlopen 加载到 R 中.

Netica_API_607/lib内目录,我都有 libnetica.alibnetica.so 。我以为-dn-dy开关会提示链接器使用 libnetica.a而不是libnetica.so 。但是,当我尝试加载libRNetica.so时使用dlopen我收到以下错误消息:

 unable to load shared object '/home/ralmond/R/x86_64-pc-linux-gnu-library/4.1/00LOCK-RNetica/00new/RNetica/libs/RNetica.so':
  libnetica.so: cannot open shared object file: No such file or directory

问题是 R 查找共享库的位置有限(例如 /usr/local/lib )。我可以动libnetica.so这些地方之一,但这需要 root 访问权限,因此没有管理员权限的人无法安装该程序。 (我已经读过如何使用共享库更好,但在这种情况下,缺乏管理员访问权限是一个问题。此外,Netica 库相当专业,因此对性能的影响很小。)

是否有一些标志可以传递给链接器以静态链接而不是动态链接?

最佳答案

Inside the Netica_API_607/lib directory, I have both libnetica.a and libnetica.so

这应该有效:

gcc -shared ... -L/home1/.../Netica_API_607/lib -Wl,-Bstatic -lnetica -Wl,-Bdynamic ...

或者,您应该能够执行以下操作:

gcc -shared ... /home1/.../Netica_API_607/lib/libnetica.a ...

I thought that the -dn and -dy switches would

这些开关是“全局的”;即:-dn 在链接器内设置一个 bool 值“从不使用共享库”,并且 -dy 将该 bool 值翻转回默认值,无论命令中的位置如何线这些开关发生。

关于r - 如何强制 ld 链接到静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68511543/

相关文章:

linux - lsof 列出的管道的 FD 列是什么意思?

Windows - 构建 .obj 文件时出现 "The command line is too long"

r - 使用 libstdc++ 安装 R 包

r - ggplot2 绘图区域边距?

c - 多个无关进程同步UART

c++ - 继承 - 符号未定义 Objective-C++

c - c 中的链接结构

r - R Markdown/Bookdown中的水平尺导致错误

正则表达式在长文本字符串文件的特定点插入新行\n

c - 我在 queue.h 中的修改是否由 Berkeley 实现?