静态链接 .so 到我的可执行文件中

静态链接 .so 到我的可执行文件中

我有一个我编写的 .cpp 代码,它是围绕商业软件程序编写的,他们提供了一个大的 C++ 库类供使用。我想将他们的一个共享对象静态链接libtdfdll.so到我的可执行文件中。他们不向我提供一个libtdfdll.a文件,而只是提供一个.so文件。我在 SLES 11.4 中使用 g++ 4.8.3 执行此操作。

我的cpp文件是process_tdf_v12.5.cpp

这是我现在为有效的基本动态链接所做的事情:

g++ process_tdf_v12.5.cpp -I../tdflibs12.5/include -L../tdflibs12.5/lib -ltdfdll -lm

这也适用于编译/链接:

g++ process_tdf_v12.5.cpp -I../tdflibs12.5/include ../tdflibs12.5/libtdfdll.so -lm

但是当我运行我的可执行文件时我得到

error while loading shared libraries: libtdfdll.so.1: cannot open shared object file: No such file or directory

除非我做一个

setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/ron/tdflibs12.5/lib

我不想这样做。

我希望我的一个可执行文件process_tdf_v12.5.cpp包含特定版本的 12.5,tdflibs12.5/lib/libtdfdll.so这样我就不需要将正确的 12.5 版本复制libtdfdll.so到其他系统,也不必担心不同的 .so 版本会导致问题。我该怎么做呢?

如果我只得到一个 .so 文件,可以用它来完成静态链接吗?

我也不想静态链接其他任何东西,只是这个libtdfdll.so文件

答案1

这是不可能的——共享库缺少静态库中包含的一些信息。看来您遇到了 XY 问题。您询问如何静态链接共享库,但您真正需要的是一种更好的方式来分发应用程序。我建议使用类似的东西。它将共享库捆绑到一个可执行文件中,呈现出一个静态链接库的外观

还有扁平包装。虽然它可能无法解决您遇到的问题,但它提供了一种非常便携的方式来交付应用程序和依赖项(而不仅仅是共享库)

相关内容