0

我正在学习共享对象 (.so) /动态链接库 (.dll)。因为我在 Linux 上只有.so文件是相关的。无论如何,当我编译一个共享库时,我会得到多个.so文件——其中大部分只是链接。这是一个屏幕截图:

在此处输入图像描述

然后我创建了另一个 Qt 控制台应用程序项目来测试这个 SO。我已经设置了所有头文件,将每个 .so 文件从以前的屏幕截图复制到这个新项目并添加

LIBS += "libAritmeticnoKodiranjeDLL.so"

到项目设置。如果我编译项目,它就可以了。但是在运行我的测试应用程序时,我收到了这个错误:

./DLLTester:加载共享库时出错:libAritmeticnoKodiranjeDLL.so.1:无法打开共享对象文件:没有这样的文件或目录

问题出在哪里,为什么我会得到这么多 .so 文件?

4

3 回答 3

1

做就是了:

LIBS += -lAritmeticnoKodiranjeDLL

库前缀(“lib”)和后缀(“.so”)的细节将由链接器处理。

于 2012-11-02T21:27:17.830 回答
1

请注意,除了一个之外的所有文件都只是符号链接,而实际文件是具有最精确版本的文件。这是为了支持不同版本的库,当版本未完全定义时,符号链接确定使用哪个确切版本。如果您要将库安装到系统库文件夹,这很重要,但如果您只是随应用程序分发一个非共享版本,那么您可以使用不带版本号的名称。

使用自定义库运行应用程序时,您需要将目录添加到 LD_LIBRARY_PATH 环境变量,以便运行时链接器找到它们。请参阅https://stackoverflow.com/search?q=LD_LIBRARY_PATH。对于故障排除,您可以运行ldd yourprogram以查看实际加载了哪些共享库,并echo $LD_LIBRARY_PATH让您确保 LD_LIBRARY_PATH 是您认为的。

于 2012-11-02T21:32:10.450 回答
1

根据我目前的经验,我可以肯定地确认在 Linux(Ubuntu 16.04)下使用 QtCreator 4.0.3 和 Qt 5.7 构建共享库时(使用TEMPLATE = lib),然后生成的目标是libName.so(当CONFIG += unversioned_libname)或libNAME.so.1.0.0(当CONFIG不变时)。但是,使用相同环境构建的应用程序在链接期间正确链接到该库LIBS += -Lfolder -lNAME(制作文件)。我花了 2 个工作日来弄清楚这一切。唯一的方法是手动更改生成的 .so 文件的名称以适应应用程序的请求。linName.so.1error while loading shared libraries: libNAME.so.1: cannot open shared object file: No such file or directorylibName.so.1

于 2016-11-16T19:51:28.727 回答