我是第一次创建库。到目前为止,它在 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/