Qt生成多个.so文件 - 要使用哪一个?

时间:2012-11-02 20:58:45

标签: qt dll shared-libraries

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

enter image description here

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

LIBS += "libAritmeticnoKodiranjeDLL.so"

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

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

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

3 个答案:

答案 0 :(得分:1)

只是做:

LIBS += -lAritmeticnoKodiranjeDLL

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

答案 1 :(得分:1)

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

使用自定义库运行应用程序时,需要将目录添加到LD_LIBRARY_PATH环境变量中,以便运行时链接程序找到它们。见https://stackoverflow.com/search?q=LD_LIBRARY_PATH。对于疑难解答,您可以运行ldd yourprogram以查看实际加载了哪些共享库,echo $LD_LIBRARY_PATH将确保LD_LIBRARY_PATH符合您的预期。

答案 2 :(得分:1)

我可以肯定地从我目前的经验中确认QtCreator 4.0.3在Linux下使用Qt 5.7(Ubuntu 16.04)时构建共享库(使用TEMPLATE = lib)然后生成的目标是libName.so(当{ {1}})或CONFIG += unversioned_libnamelibNAME.so.1.0.0未更改时)。但是,使用相同环境构建的应用程序在链接期间正确链接到该库(CONFIG),但遗憾的是在运行时它请求LIBS += -Lfolder -lNAME,因为"应用程序输出"说linName.so.1(我可以在应用程序生成的二进制文件中看到error while loading shared libraries: libNAME.so.1: cannot open shared object file: No such file or directory,但在其他地方看不到 - 不在Make文件中。我花了2个工作日来搞清楚这一切。唯一的方法是手动更改生成的.so文件的名称以适合应用程序请求。