【问题标题】:Common ways to use a Qt shared library with an application and cmake将 Qt 共享库与应用程序和 cmake 一起使用的常用方法
【发布时间】:2013-04-29 14:06:25
【问题描述】:

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

但现在我想使用共享库。使用add_library 和关键字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. 有没有办法在不包含头文件的情况下加载库或在编译时使用它(在运行时加载库)?我读到有一种方法,但这并不容易

希望我的问题是清楚的,不要“白痴”,否则请写评论

【问题讨论】:

    标签: c++ qt4 cmake shared-libraries


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

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多