我如何强制 ld 对静态库 link
How can I force ld to link against static library
我正在尝试创建一个共享库对象(将使用 dlopen 加载到 R 中),它 link 是第三方库的静态版本而不是动态版本。 (目标是拥有一个而不是两个用户需要移动到位的共享库。)
这是用于 link 最终可执行文件的调用:
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.a
和 libnetica.so
。我认为 -dn
和 -dy
开关会提示 link 用户使用 libnetica.a
而不是 libnetica.so
。但是,当我尝试使用 dlopen
加载 libRNetica.so
时,我收到以下错误消息:
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 库相当专业,因此性能影响很小。)
是否有一些标志我可以静态地而不是动态地传递给 linker 到 link?
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
将链接器内部的布尔值设置为“从不使用共享库”,并且 -dy
将该布尔值翻转回默认值,无论这些开关在命令行的何处出现。
我正在尝试创建一个共享库对象(将使用 dlopen 加载到 R 中),它 link 是第三方库的静态版本而不是动态版本。 (目标是拥有一个而不是两个用户需要移动到位的共享库。)
这是用于 link 最终可执行文件的调用:
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
.
在 Netica_API_607/lib
目录中,我有 libnetica.a
和 libnetica.so
。我认为 -dn
和 -dy
开关会提示 link 用户使用 libnetica.a
而不是 libnetica.so
。但是,当我尝试使用 dlopen
加载 libRNetica.so
时,我收到以下错误消息:
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 库相当专业,因此性能影响很小。)
是否有一些标志我可以静态地而不是动态地传递给 linker 到 link?
Inside the
Netica_API_607/lib
directory, I have bothlibnetica.a
andlibnetica.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
将链接器内部的布尔值设置为“从不使用共享库”,并且 -dy
将该布尔值翻转回默认值,无论这些开关在命令行的何处出现。