将 Qt 项目文件迁移到 CMake

Posted

技术标签:

【中文标题】将 Qt 项目文件迁移到 CMake【英文标题】:Migrating Qt project file to CMake 【发布时间】:2016-10-03 14:47:17 【问题描述】:

我正在尝试迁移一个 QtProject 文件,正是来自 https://github.com/gamecreature/QtAwesome 的 QtAwesome 库

我试图迁移的项目文件是:

TARGET = QtAwesome
TEMPLATE = lib
CONFIG += staticlib c++11

SOURCES += QtAwesome.cpp
HEADERS += QtAwesome.h

isEmpty(PREFIX) 
    unix 
        PREFIX = /usr
     else 
        PREFIX = $$[QT_INSTALL_PREFIX]
    


install_headers.files = QtAwesome.h
install_headers.path = $$PREFIX/include
target.path = $$PREFIX/lib
INSTALLS += install_headers target

RESOURCES += \
    QtAwesome.qrc

我的翻译是:

cmake_minimum_required(VERSION 2.8.11)

project(QtAwesome)
file(GLOB_RECURSE CODE_FILES QtAwesome.cpp)
find_package (Qt5Core REQUIRED)
ADD_DEFINITIONS(-DQTAWESOME_LIBRARY)

qt5_add_resources(RESOURCE_FILES QtAwesome.qrc)
qt5_wrap_cpp(LIB_HEADER_MOC QtAwesome.h)

add_library(QtAwesome STATIC QtAwesome.cpp QtAwesome.h)
target_link_libraries(QtAwesome
    Qt5::Widgets
)

它可以编译,但是当我尝试使用这个构建的库时,我收到以下错误:

[100%] Linking CXX executable MyProject.exe
QtAwesome.lib(QtAwesome.cpp.obj) : error LNK2019: unresolved external symbol "int __cdecl qInitResources_QtAwesome(void)" (?qInitResources_QtAwesome@@YAHXZ) referenced in function "public: bool __cdecl QtAwesome::initFontAwesome(void)" (?initFontAwesome@QtAwesome@@QEAA_NXZ)

MyProject.exe : fatal error LNK1120: 1 unresolved externals

【问题讨论】:

LIB_SOURCE 设置在哪里? @mascoj 我刚刚更新了没有 LIB_SOURCE 的 cmake 文件并设置了我的源,但我仍然遇到问题 【参考方案1】:

你的 cmake 项目有几个问题:

file(GLOB_RECURSE CODE_FILES QtAwesome.cpp)

您没有在任何地方使用CODE_FILES。此外,使用带有文件名而不是文件模式的 glob 是没有意义的,并且不应使用 glob 来收集源代码(参见documentation)。

ADD_DEFINITIONS(-DQTAWESOME_LIBRARY)

QTAWESOME_LIBRARY 没有在 QtAwesome 的代码中的任何地方使用(参见 search result in the repository)。无论如何,如果你必须添加定义,你可以考虑target_compile_definitions

qt5_add_resources(RESOURCE_FILES QtAwesome.qrc)
qt5_wrap_cpp(LIB_HEADER_MOC QtAwesome.h)

RESOURCE_FILESLIB_HEADER_MOC 在调用 add_library 时不会添加到源代码中:资源和 moc 文件不会编译到您的库中(我想这是您的主要问题)。您可以考虑改用CMAKE_AUTOMOCCMAKE_AUTORCC

find_package (Qt5Core REQUIRED)

# ...

target_link_libraries(QtAwesome
    Qt5::Widgets
)

您正在链接 Widgets 模块,同时仅查找 Core 模块。

您的 cmake 项目中不需要 C++11 标准:您可以使用 CMAKE_CXX_STANDARD 来要求它,或者,如果您知道需要标准的哪一部分,请使用 compile features。

清理后,您的 cmake 项目可能如下所示:

cmake_minimum_required(VERSION 2.8.11)

project(QtAwesome)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5 REQUIRED COMPONENTS Widgets)

add_library(QtAwesome STATIC
    QtAwesome.cpp
    QtAwesome.h
    QtAwesome.qrc
)
target_link_libraries(QtAwesome
    Qt5::Widgets
)

【讨论】:

【参考方案2】:

我发现这很有帮助 https://github.com/qt/qtbase/blob/dev/util/cmake/run_pro2cmake.py

我能够将 qmake (.pro) 项目转换为 cmake。它生成了一个有效的 CMakeLists.txt

【讨论】:

以上是关于将 Qt 项目文件迁移到 CMake的主要内容,如果未能解决你的问题,请参考以下文章

包含另一个 CMake 项目作为库

使用 cmake (windows) 构建时不显示 Qt 资源

无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像

Qt:PRO 到 CMake 的转换——AutoMoc 子进程错误

如何将 qrc 数据包含到使用 CMake 编译的基于 Qt 的二进制文件中

使用 cmake 的跨平台 Qt5 项目