0

目前我有一个应用程序和一个(静态)库,都是用 Qt 编写的。作为构建系统,我使用 cmake。我将库链接target_link_libraries到可执行文件,一切正常(我有一个文件/可执行文件)。

但现在我想使用共享库。add_library使用and 关键字创建共享库SHARED有效,但我对如何加载共享库的方式有点困惑。我看到了两种“方式”:

  1. 编写一个库并使用Q_DECL_EXPORT/ Q_DECL_IMPORT。他们加载库QLibrary并使用类型转换来解析所有(C)函数
  2. 编写一个库并将头文件包含在应用程序中。使用 cmake 命令将共享库“传递”给可执行文件target_link_libraries。他们不使用 QLibrary 来加载库。

现在我有几个问题:

  1. 加载共享库的常见(“正常”)方式是什么?使用 __cdecl 将所有 C++ 方法导出到 C 函数(方式 1)或包含头文件(方式 2)?其他解决方案?
  2. 与方式 2(包括标题)相关 - 库是如何加载的?通过操作系统?如果我移动库,应用程序找不到库 -> 运行时加载的库?
  3. 有没有办法在不包含头文件的情况下加载库或在编译时使用它(在运行时加载库)?我读到有一种方法,但这并不容易

我希望我的问题是清楚的,而不是“noobish”,否则请写评论

4

1 回答 1

0
  1. 我想第二种方式更常见,虽然我都遇到过。
  2. 在第二种方式中,库在应用程序启动时由 os 加载。如果 os 找不到库 - 应用程序将无法启动。
  3. 无论您使用哪种方法,您都需要了解函数的语义。这意味着您将以这种或另一种方式包含包含它们的标题。

Qt 还为您提供了另一种在运行时加载库的方法,使用插件方法:link

于 2013-05-02T08:54:57.627 回答