当从终端手动 运行 时,我的项目找不到它的库
My project can't find its libraries when run manually from the terminal
我是第一次创建库。到目前为止,它在 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 下遇到问题,我会回来的。 :-)
简答
我 运行 同时遇到多个问题。
- 第一个问题:损坏的符号 links(它们就像 Windows 中的快捷方式)。
- 其次:我的库需要复制到不同于通常推荐的系统目录中。
- 第三:Qt Creator 和 QMake 使传递自定义 linker 选项变得困难。
详情
当 Qt Creator 编译我的库时,它会自动为它创建三个具有不同版本号布局的符号 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)
出于某种原因(我不知道为什么)每次我将 link 移动到像 usr/local/lib
这样的系统目录时,link 都会中断。起初我没有注意到这一点,甚至没有想去检查一下,因为我以前从未发生过这种情况。移动 link 在过去一直有效。为了解决这个问题,我只是在它们所在的目录中手动创建了 links。
把links坏掉了,把库放到usr/local/lib
里还是不行,但是usr/lib
和/usr/lib/x86_64-linux-gnu
(博客里推荐link在下面编辑)确实有效!
这些修复实际上是在我阅读 this blog and this article 它 link 后查看的另一个修复之后出现的。
那里说要将 -Wl,-rpath,'$ORIGIN/lib'
添加到 gcc 构建选项以将库搜索路径嵌入到应用程序本身。这组选项允许我将我的库文件放在我想要的任何地方(具体来说,在应用程序工作目录中名为 /lib 的目录中)。
不幸的是,它有两个问题。首先,Qt Creator(据我所知)不允许您通过 GUI 为各个子项目指定自定义构建选项,因此我必须弄清楚如何使用项目文件添加 linker 选项,假设那是可能的,确实如此。
其次,QMake 搞乱了 gcc 选项,嵌入到我的应用程序中 Library rpath: [RIGIN/lib]
而不是像它应该的那样 Library rpath: [lib]
。
最后,更改提议的 linker 选项...
-Wl,-rpath,'$ORIGIN/lib'
...到以下QMake项目文件行...
QMAKE_LFLAGS += -Wl,-rpath,'lib'
...锻炼得很好。使用这两个修复程序,我现在可以在我的系统上安装我的库或将其放入 /lib 文件夹,程序将 运行.
我是第一次创建库。到目前为止,它在 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 下遇到问题,我会回来的。 :-)
简答
我 运行 同时遇到多个问题。
- 第一个问题:损坏的符号 links(它们就像 Windows 中的快捷方式)。
- 其次:我的库需要复制到不同于通常推荐的系统目录中。
- 第三:Qt Creator 和 QMake 使传递自定义 linker 选项变得困难。
详情
当 Qt Creator 编译我的库时,它会自动为它创建三个具有不同版本号布局的符号 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)
出于某种原因(我不知道为什么)每次我将 link 移动到像 usr/local/lib
这样的系统目录时,link 都会中断。起初我没有注意到这一点,甚至没有想去检查一下,因为我以前从未发生过这种情况。移动 link 在过去一直有效。为了解决这个问题,我只是在它们所在的目录中手动创建了 links。
把links坏掉了,把库放到usr/local/lib
里还是不行,但是usr/lib
和/usr/lib/x86_64-linux-gnu
(博客里推荐link在下面编辑)确实有效!
这些修复实际上是在我阅读 this blog and this article 它 link 后查看的另一个修复之后出现的。
那里说要将 -Wl,-rpath,'$ORIGIN/lib'
添加到 gcc 构建选项以将库搜索路径嵌入到应用程序本身。这组选项允许我将我的库文件放在我想要的任何地方(具体来说,在应用程序工作目录中名为 /lib 的目录中)。
不幸的是,它有两个问题。首先,Qt Creator(据我所知)不允许您通过 GUI 为各个子项目指定自定义构建选项,因此我必须弄清楚如何使用项目文件添加 linker 选项,假设那是可能的,确实如此。
其次,QMake 搞乱了 gcc 选项,嵌入到我的应用程序中 Library rpath: [RIGIN/lib]
而不是像它应该的那样 Library rpath: [lib]
。
最后,更改提议的 linker 选项...
-Wl,-rpath,'$ORIGIN/lib'
...到以下QMake项目文件行...
QMAKE_LFLAGS += -Wl,-rpath,'lib'
...锻炼得很好。使用这两个修复程序,我现在可以在我的系统上安装我的库或将其放入 /lib 文件夹,程序将 运行.