c++ - 从终端手动运行时,我的项目找不到它的库

标签 c++ dll shared-libraries qt-creator

我是第一次创建库。到目前为止,它在 IDE (Qt Creator) 中运行,但当我手动运行其测试程序时,它无法在终端运行。

我的项目有两个部分,库和用于测试它的沙箱。我在 Qt Creator 中创建了一个项目,其中包括两个子项目(一个用于构建库,一个用于构建测试器)并且都编译无误。当我从 IDE 运行沙箱时,库动态链接到沙箱,函数 greeting() 从中加载,然后调用,并打印“Welcome to the library!”到 std::cout。但是,如果我在终端中打开构建文件夹并直接使用 ./sandbox 运行沙箱,我会得到:

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

我认为这意味着我需要正确安装我的自定义库 libengine.so.1。当我查看如何执行此操作时,我发现我只需要将库文件复制到 /usr/lib/usr/local/lib 中,但是这些都不起作用,我仍然收到上述错误。过去,在编译第 3 方库(我认为是 SDL)时,这个简单的解决方案确实对我有用,但我不知道我遗漏了什么,这意味着它现在不起作用。到目前为止,我还没有找到任何更详细的信息,我也不知道我做错了什么或错过了什么。

当我直接从命令行运行我的沙箱程序时,如何让它看到它的配套库?

注意:我专门询问有关 Linux/Ubuntu 的问题。如果我以后在 Windows 下遇到问题,我会回来的。 :-)

最佳答案

简答

我同时遇到了多个问题。

  • 第一个问题:损坏的符号链接(symbolic link)(它们就像 Windows 中的快捷方式)。
  • 其次:我的库需要复制到不同于通常推荐的系统目录中。
  • 第三:Qt Creator 和 QMake 使传递自定义链接器选项变得困难。

详情

当 Qt Creator 编译我的库时,它会自动创建三个具有不同版本号布局的符号链接(symbolic link)。

> ll
lib-engine.so -> lib-engine.so.0.1.0
lib-engine.so.0 -> lib-engine.so.0.1.0
lib-engine.so.0.1 -> lib-engine.so.0.1.0
lib-engine.so.0.1.0 (original library file)

出于某种原因(我不知道为什么),每次我将链接移动到系统目录(如 usr/local/lib)时,链接都会中断。起初我没有注意到这一点,甚至没有想去检查一下,因为我以前从未发生过这种情况。移动链接在过去一直有效。为了解决这个问题,我只是在它们所在的目录中手动创建了链接。

除了断开的链接,将库放入 usr/local/lib 仍然没有用,但是 usr/lib/usr/lib/x86_64-linux-gnu(在下面链接的博客中推荐)确实有效!

这些修复实际上是在我阅读 this blog 后查看的另一个修复之后出现的和 this article它链接到。

它说要将 -Wl,-rpath,'$ORIGIN/lib' 添加到 gcc 构建选项,以将库搜索路径嵌入到应用程序本身。这组选项允许我将我的库文件放在我想要的任何地方(具体来说,在应用程序工作目录中名为/lib 的目录中)。

不幸的是,这有两个问题。首先,Qt Creator(据我所知)不允许您通过 GUI 为各个子项目指定自定义构建选项,所以我必须弄清楚如何使用项目文件添加链接器选项,假设这是可能的,这是的。

其次,QMake 搞乱了 gcc 选项,嵌入到我的应用程序 Library rpath: [RIGIN/lib] 而不是像它应该的那样 Library rpath: [lib]到。

最后,更改建议的链接器选项...

-Wl,-rpath,'$ORIGIN/lib'

...到以下 QMake 项目文件行...

QMAKE_LFLAGS += -Wl,-rpath,'lib'

... 锻炼得很好。使用这两个修复程序,我现在可以在我的系统上安装我的库或将其放入/lib 文件夹,程序将运行。

关于c++ - 从终端手动运行时,我的项目找不到它的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56465876/

相关文章:

c++ - 那里有 "function size profiler"吗?

c++ - 递归中需要双指针

c++ - APP和DLL依赖一些文件: on which directory?

c++ - 如何在共享库中找到 C++ isfinite() 的解析位置?

c - dlopen 与标准动态链接的用例是什么?

c++ - 尝试改进算法以使其更通用

C++ 复制和调整使用 new 运算符初始化的已分配数组的大小

c++ - 调用约定错误!! (ESP 的值未在函数调用中正确保存)

c# - c#中来自c++的unsigned char数组

c++ - Windows 中的 Qt 共享库,不生成 .lib 文件