【问题标题】:how to use a shared library which includes another shared library in c++如何在 C++ 中使用包含另一个共享库的共享库
【发布时间】:2020-11-18 01:00:41
【问题描述】:

我有一个 c++ 程序,它包含两个类。其中之一是使用libssh 及其一些功能,另一个是用于计算cpu 使用率。有一个链接说明我如何构建和添加 libssh:libssh's functions couldn't be found on qt
我的程序运行良好。现在我想用它构建一个.so 库以在其他程序中使用。首先我制作了两个这样的 .o 文件:

 gcc -c -fPIC info.cpp -o info.o
 gcc -c -fPIC cpuusage.cpp -o cpuusage.o

我从他们那里做了一个 .so:

gcc -shared -o libsmc.so info.o cpuusage.o

每当我想使用 libsmc.so 时,我都会包含 info.h,但问题是找不到 libssh 函数。我想我必须将libssh 静态添加到我的项目中。但我不知道怎么做!
Ps:我看了这个解释:Using a shared library in another shared library,但这是用于通过命令行链接程序中已使用的共享库,我不想用命令行编译程序并希望不断链接库。

【问题讨论】:

标签: qt shared-libraries static-libraries qmake libssh


【解决方案1】:

要使用外部库构建 C/C++ 软件,我真的建议使用构建系统而不是手动输入命令。

C++ 最常用的构建系统是 CMake (https://cmake.org/),它得到了 Qt 的良好支持,但也存在许多其他构建系统。另一个是 QMake,它是 Qt 的构建系统。 如果您使用的是 IDE,例如 QtCreator 或 Microsoft Visual Studio,则也集成了 CMake。有很多教程和示例可以将 CMake 用于项目(例如 https://mirkokiefer.com/cmake-by-example-f95eb47d45b1),尽管学习曲线没有我想要的那么陡峭。

但是如果你仍然想使用命令行(或者调试CMake生成的命令行):当链接到一个库时,你需要:

  1. 给出编译器的包含路径,即可以找到外部库的 .h 的路径。使用 gcc,这是通过 -I 完成的,例如“-I/usr/lib/mylib/include”。
  2. 为链接器提供库文件夹和名称,即找到已编译库的路径及其名称。使用 gcc,这是通过使用 -L 作为路径和 -l 作为名称来完成的。有关这些命令的更多详细信息,请查看 gcc 手册。

如果你想使用 CMake,那么你可以使用函数:

target_include_directories(..)

target_link_libraries(..)

【讨论】:

  • 我知道你的意思,但我的问题不是在我的代码中使用库,而是我从我的代码中创建了一个共享库,它本身使用另一个名为 @ 的共享库987654325@,我想在任何地方使用我自己的库,但它依赖于libssh。我想摆脱这些依赖,同时我在我的代码中使用libssh。也许这意味着我应该静态使用libssh,而不是动态使用。但我不知道该怎么做。
  • 我认为你有两个选择:a)要摆脱依赖,是的,你需要静态链接。但这并不总是允许的,您需要检查 libssh 的许可证才能知道这是否允许。要静态链接,我认为您应该给 gcc 一个参数 -l 以及 lib .a (linux) 或 .lib (Windows) 的完整路径。 b) 如果许可证不能用于静态链接,则接受依赖项并将 libssh 与您的软件一起分发。这也很常见。如果您不将 libssh 包含在您的 .h 中而仅在 .cpp 中,则用户将不需要 libssh 的包含。
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2015-09-30
相关资源
最近更新 更多