将 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_FILES
和 LIB_HEADER_MOC
在调用 add_library
时不会添加到源代码中:资源和 moc 文件不会编译到您的库中(我想这是您的主要问题)。您可以考虑改用CMAKE_AUTOMOC
和CMAKE_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 (windows) 构建时不显示 Qt 资源
无法在 Qt5/cmake 项目中加载 Qt 资源文件中指定的图像
Qt:PRO 到 CMake 的转换——AutoMoc 子进程错误