我是第一次创建图书馆。到目前为止,它可以在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下遇到问题,我会回来的。 :-)
答案 0 :(得分:1)
我一次遇到了多个问题。
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 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文件夹,程序将运行。