【问题标题】:Qt generates multiple .so files - which one to use?Qt 生成多个 .so 文件 - 使用哪一个?
【发布时间】:2012-11-02 20:58:45
【问题描述】:

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

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

LIBS += "libAritmeticnoKodiranjeDLL.so"

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

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

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

【问题讨论】:

标签: qt dll shared-libraries


【解决方案1】:

只要做:

LIBS += -lAritmeticnoKodiranjeDLL

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

【讨论】:

  • 遗憾的是,我现在得到 :-1: error: error: AritmeticnoKodiranjeDLL: No such file or directory
  • 糟糕,我的意思是-lAritmeticnoKodiranjeDLL。我已经有一段时间没有使用 qmake 了。此外,您可能必须添加 -L/path/to/directory/ 以便链接器可以找到该库。
  • 如果该目录不在默认库搜索路径之一中,您可能还必须设置 LD_LIBRARY_PATH
  • 好吧,我的项目设置中的 LIB 行现在是 LIBS += -L/home/me/ProjectFolder/-lAritmeticnoKodiranjeDLL - 另外,在终端中我添加了 LD_LIBRARY_PATH 和 echo $LD_LIBRARY_PATH 现在报告 /home/me/ProjectFolder/:。我仍然在 Qt 中遇到错误:(.text.startup+0x39):-1: error: undefined reference to `AritmeticnoKodiranjeDLL::Author()'
  • 该错误意味着链接器已找到动态库并正在尝试链接,但未在库中找到所需的符号。未定义的引用可能是您缺少 Author() 的实现或未在链接库中导出符号。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的评论,我编辑了LD_LIBRARY_PATH 并遵循了@Kyle 的建议,但我无法让它工作。你能帮助我们吗(见最后的评论)? :)
  • 在答案中添加了一些故障排除提示。
【解决方案3】:

根据我目前的经验,我可以肯定地确认 QtCreator 4.0.3 和 Qt 5.7 在 Linux (Ubuntu 16.04) 下构建共享库时(使用 TEMPLATE = lib)然后生成的目标是 libName.so(当 CONFIG += unversioned_libname 时)或libNAME.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(我可以看到 libName.so.1 在生成的应用程序二进制文件,但没有其他地方 - 不在 Make 文件中)。我花了 2 个工作日来弄清楚这一切。唯一的方法是手动更改生成的 .so 文件的名称以适应应用程序的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多