使用 qt-creator 将库项目链接到 qt 控制台/小部件项目

Posted

技术标签:

【中文标题】使用 qt-creator 将库项目链接到 qt 控制台/小部件项目【英文标题】:Link library project to qt console/widget project with qt-creator 【发布时间】:2020-03-28 22:58:54 【问题描述】:

使用 Qt-Creator,假设我有这 2 个项目:

库/C++ 库

应用程序/Qt 控制台应用程序

我希望将库项目与应用程序项目链接起来,当我构建后者时,编译器知道如何找到 *.a 和 *.dll(或 *.so,如果在 linux 中运行 qt-creator ) 其他项目中的文件。我也希望能够以这种方式使用库中的标头:

#include <lib_example_header>

并且在构建项目时,编译器也知道如何找到正确的 *.h 文件。

有人知道怎么做吗?

【问题讨论】:

这与qt creator无关你问的是如何在qmake中做到这一点。您可能希望谷歌搜索这些术语,看看会发生什么。 Qt Creator 只是一个前端,它为您提供 qmake .pro 文件的模板。从那里出发取决于你。一般来说,您会希望有 one 项目 - 一个子目录项目,将库和应用程序作为两个子项目。但它仍然会与 qmake 混淆。我建议手动创建一个CMakeFile.txt,将库与可执行文件链接起来非常简单。然后在 Qt Creator 中打开该文件 :) 我的问题涉及 qt-creator,因为我想知道是否有某种方法可以使用 qt-creator 设置进行“链接”,ide 可以自动完成所有涉及库的编译器/链接器任务.我的意思是,将这 2 个项目“链接”后,在编译或链接 at 控制台或小部件项目时,ide 根据它理解的项目文件的正确文件位置将相关选项添加到编译器/链接器。 绝对不是。 Qt Creator 不处理与构建过程相关的任何事情。这是一个IDE。它让构建工具处理构建、链接等。 IDE 不需要访问编译器/链接器选项。 IDE 所做的只是使用添加到路径中的首选编译器来初始化项目,从那时起,您就只能靠自己了。 IDE 使用您选择的构建工具(qmake 或 cmake)中的元数据来报告项目结构。它会为您调用构建工具和调试器。并运行 clang server 生成代码模型。但它无法访问任何选项,您也不想这样做。自远古以来,我们就已经在 Visual Studio 中搞得一团糟。最好忘记这个失误。 【参考方案1】:

我们将使用 cmake 来执行此操作,因为这是您在任何新项目中都应该使用的,而且它比 qmake 所需的三个 (3!) 项目文件更容易处理 10 倍。不值得。甚至,这不是一种可转移的技能。

因此,假设我们有一个 mylibrary 静态库,它将链接到 myexe 可执行文件。

要开始使用,只需将以下四个文件添加到一个文件夹中(它们是完整的),然后在 Qt Creator 中打开该项目。选择您喜欢的构建工具包(编译器和 Qt 构建的组合)。然后按 Ctrl-B(或 Mac 上的 ⌘-B),等待构建完成。然后 Ctrl-R / ⌘-R 运行它。应该会出现一条消息。

从那时起,您将需要阅读一些 cmake 文档以了解以下所有内容的含义,尤其是 PRIVATE/INTERFACE/PUBLIC 的区别。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(test10 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt5 COMPONENTS Widgets REQUIRED)

add_library(mylibrary STATIC
    lib.cpp
    lib.h
)
target_link_libraries(mylibrary PUBLIC Qt5::Core)
target_include_directories(mylibrary PUBLIC .)

add_executable(myexe
    main.cpp
)
target_link_libraries(myexe PRIVATE Qt5::Widgets mylibrary)

库提供了一个简单的getString()函数:

// lib.h
#pragma once
#include <QString>

namespace lib 
QString getString();
;
// lib.cpp
#include "lib.h"

namespace lib 
QString getString() 
   return QStringLiteral("Hello, world!");


可执行文件使用该函数显示一条消息:

// main.cpp
#include <lib.h>
#include <QtWidgets>

int main(int argc, char *argv[])

   QApplication a(argc, argv);
   QMessageBox::information(nullptr, "Information", lib::getString());

这可能是实现它的最简单方法。我什至不会费心添加一个等效的 qmake 示例:您需要三个 .pro 文件,并且没有自动链接子项目输出的方法。 CMake 是这里的简单方法。

【讨论】:

我试试这个选项,创建 CMakeLists.txt 文件并复制/粘贴上面的内容(只需将名称 mylibrarymyexe 更改为我在这里已经拥有的项目的名称,并且库的文件名是 example.cpp 和 example.h)。当我在 qt-creator 中打开时,我得到屏幕配置项目,要求我选择要使用的套件 - 但没有一个选项可供选择。唯一启用的选项是“导入现有构建...”,它会打开一个对话框以从磁盘上进行选择。 @KleberMota 那么,这就是问题所在。 Qt Creator 只是一个 IDE。它本身不会构建任何东西。您必须安装 Qt 的构建才能使用,以及一些编译器。这个问题与 cmake 或这个示例项目无关,尽管在尝试新事物时我建议什么都不做。您可以稍后在 Qt Creator 的编辑器中更改项目名称(您将在那里维护 CMakeLists.txt 文件)。使用 Qt 维护工具至少下载一个基于 mingw 的基本 Qt 版本。这将包括 gnu 编译器工具。

以上是关于使用 qt-creator 将库项目链接到 qt 控制台/小部件项目的主要内容,如果未能解决你的问题,请参考以下文章

QT-creator 2.8 不会部署到 android,ant clean 调试失败

qt-creator debug pure C

无法在发布模式下编译的 ide 之外运行 qt-creator 可执行文件

下载QT-Creator

Qt-creator 不会在 Android 上显示本地或表达式

将库链接到 cmake 项目中的所有目标