使用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 应用程序
Cmake 无法在 qt creator/collect2 上编译简单的测试程序:错误:ld
使用 CMake 构建时如何使 QtCreator 识别 OpenGL 函数的自动完成功能?
qt creator创建cmake构建的程序,无法启动调试(点左下角运行不出结果 No executable specified.)