C++ 我的项目可以';从终端手动运行时,无法找到其库

C++ 我的项目可以';从终端手动运行时,无法找到其库,c++,dll,shared-libraries,qt-creator,C++,Dll,Shared Libraries,Qt Creator,我第一次创建了一个库。到目前为止,它是在IDE(Qt Creator)上工作的,但当我手动运行它的测试程序时,它不是在终端上工作的 我的项目有两个部分:库和用于测试它的沙箱。我在QtCreator中创建了一个项目,其中包括两个子项目(一个用于构建lib,一个用于构建tester),并且两个子项目都编译时没有错误。当我从IDE运行沙盒时,库被动态链接到沙盒,函数greeting()从中加载,然后调用,并将“欢迎使用库!”打印到std::cout。但是,如果我在终端中打开build文件夹并直接使用/

我第一次创建了一个库。到目前为止,它是在IDE(Qt Creator)上工作的,但当我手动运行它的测试程序时,它不是在终端上工作的

我的项目有两个部分:库和用于测试它的沙箱。我在QtCreator中创建了一个项目,其中包括两个子项目(一个用于构建lib,一个用于构建tester),并且两个子项目都编译时没有错误。当我从IDE运行沙盒时,库被动态链接到沙盒,函数
greeting()
从中加载,然后调用,并将“欢迎使用库!”打印到
std::cout
。但是,如果我在终端中打开build文件夹并直接使用
/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下遇到问题,我会回来的。:-)

简短回答 我一下子遇到了多个问题

  • 第一个问题:断开的符号链接(它们就像Windows中的快捷方式)
  • 第二:需要将我的库复制到不同的系统目录,而不是通常推荐的目录
  • 第三:Qt创建者和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\u 64-linux-gnu
(在下面链接的博客中推荐)确实起作用

这些修复实际上是在我阅读后查看的另一个修复之后出现的,它链接到了

在这里,它说要将
-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文件夹,程序将运行。

Short-Answer 我一下子遇到了多个问题

  • 第一个问题:断开的符号链接(它们就像Windows中的快捷方式)
  • 第二:需要将我的库复制到不同的系统目录,而不是通常推荐的目录
  • 第三:Qt创建者和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\u 64-linux-gnu
(在下面链接的博客中推荐)确实起作用

这些修复实际上是在我阅读后查看的另一个修复之后出现的,它链接到了

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

不幸的是,这本身就有两个问题。首先,Qt Creator(据我所知)不允许您通过GUI为单个子项目指定自定义构建选项,因此我必须找出如何使用项目文件添加链接器选项,假设这是可能的,事实就是如此

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