从终端手动运行时,我的项目找不到其库

时间:2019-06-05 18:09:37

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

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

我的项目有两个部分,一个是库,另一个是用于测试它的沙箱。我已经在Qt Creator中创建了一个项目,该项目包括两个子项目(一个用于构建lib,另一个用于构建测试器),并且都可以正确编译。当我从IDE运行沙箱时,库是动态链接到沙箱的,函数greeting()从沙箱中加载,然后调用,并显示“欢迎使用库!”。到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中,但是这些都不起作用,我仍然遇到上述错误。过去,这种简单的解决方案在编译第三方库(我认为是SDL)时确实对我有用,而且我不知道我缺少什么,这意味着它现在将无法工作。到目前为止,我还没有找到任何更详细的信息,也不知道我在做什么错或错过了。

直接从命令行运行沙箱程序时,如何使它看到其伴随库?

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

1 个答案:

答案 0 :(得分:1)

简短回答

我一次遇到了多个问题。

  • 第一个问题:断开的符号链接(它们类似于Windows中的快捷方式)。
  • 第二:我的lib需要复制到通常建议的其他系统目录中。
  • 第三:Qt Creator和QMake难以传递自定义链接器选项。

详细信息

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

> 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 blogthis 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文件夹,程序将运行。