使用CMake构建Qt程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CMake构建Qt程序相关的知识,希望对你有一定的参考价值。

参考技术A Ubuntu系统中默认安装了Qt,这样安装的Qt不仅版本较低,而且切换版本麻烦,可能导致某些依赖系统Qt的程序无法正常使用
去官网使用离线安装包或在线安装包安装任意路径即可

在CMakeLists.txt文件中添加如下,指定Qt库位置

Qt6 桌面应用程序和使用 cmake 的共享库

【中文标题】Qt6 桌面应用程序和使用 cmake 的共享库【英文标题】:Qt6 desktop app and shared library with cmake 【发布时间】:2021-02-18 14:49:33 【问题描述】:

我正在尝试使用 cmake 创建一个带有子目录的项目。 当使用 qmake 时,这个机制是在 Qt creator 中构建的。 该项目包含一个共享库和一个桌面应用程序。 以下是我拥有的项目和cmake的结构:

主cmake:

cmake_minimum_required (VERSION 3.5)

project(contractapp)

add_subdirectory(contract-core)
add_subdirectory(contract-desktop)

桌面应用cmake:


project(contract-desktop LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

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

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "$CMAKE_CURRENT_SOURCE_DIR/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            $CMAKE_CURRENT_SOURCE_DIR/path/to/libcrypto.so
#            $CMAKE_CURRENT_SOURCE_DIR/path/to/libssl.so)
#    endif()
#endif()

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt$QT_VERSION_MAJOR COMPONENTS Widgets REQUIRED)
find_package(contract-core REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        MainWindow.cpp
        MainWindow.h
        MainWindow.ui
)

if($QT_VERSION_MAJOR GREATER_EQUAL 6)
    qt_add_executable(contract-desktop
        $PROJECT_SOURCES
    )
else()
    if(ANDROID)
        add_library(contract-desktop SHARED
            $PROJECT_SOURCES
        )
    else()
        add_executable(contract-desktop
            $PROJECT_SOURCES
        )
    endif()
endif()

target_link_libraries(contract-desktop PRIVATE Qt$QT_VERSION_MAJOR::Widgets)

共享库 cmake:

cmake_minimum_required(VERSION 3.14)

project(contract-core LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt$QT_VERSION_MAJOR COMPONENTS Core REQUIRED)

add_library(contract-core SHARED
  contract-core_global.h
  Person.cpp
  Person.h
)

target_link_libraries(contract-core PRIVATE Qt$QT_VERSION_MAJOR::Core)

target_compile_definitions(contract-core PRIVATE CONTRACTCORE_LIBRARY)

我的问题是桌面应用程序看不到我正在制作的库。

【问题讨论】:

“我的问题是桌面应用程序看不到库” - 请详细说明。构建应用程序时是否出现错误?还是在运行应用程序时出现错误?你得到什么确切的错误信息 当我尝试从库中包含类时,我有一个错误,找不到这个文件。 您对错误信息的描述非常模糊。请显示(添加到问题帖子中)您收到的确切错误消息。 由于没有在 CMAKE_MODULE_PATH 中提供“Findcontract-core.cmake”,该项目要求 CMake 查找“contract-core”提供的包配置文件,但 CMake 没有找到。找不到由“contract-core”提供的具有以下任何名称的包配置文件: contract-coreConfig.cmake contract-core-config.cmake 将“contract-core”的安装前缀添加到CMAKE_PREFIX_PATH或设置“contract- core_DIR" 到包含上述文件之一的目录。如果“contract-core”提供单独的开发包或SDK,请确保已安装。 至于find_package,则不需要定位在项目中创建的库本身。 CMake 已经知道该项目中的所有库。如果您想链接在项目中创建的某个库,只需使用其目标名称,就像传递给add_library 调用一样。在您的情况下,将可执行文件与库链接只需使用target_link_libraries(contract-desktop PRIVATE contract-core) 【参考方案1】:

该库必须复制到应用程序所在的同一文件夹中。否则,每个库都在其自己的文件夹中,应用程序将看不到它。您很可能希望将两个二进制文件(应用程序和库)的目标文件夹设置为两者的一些通用构建子文件夹。

【讨论】:

以上是关于使用CMake构建Qt程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MSYS2 中通过 CMake 构建 c++ Qt5 应用程序

Qt6-CMake模板项目模板

Cmake 无法在 qt creator/collect2 上编译简单的测试程序:错误:ld

使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?

qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)

cmake 学习笔记