c++ - 将 Qt 项目文件迁移到 CMake

标签 c++ qt cmake qt5

我正在尝试迁移一个 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

最佳答案

你的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
)

关于c++ - 将 Qt 项目文件迁移到 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834389/

相关文章:

c++ - g++优化: O2 flag fixes a broken code where O3 breaks it again

c++ - 时间格式 hh :mm:ss input

qt - Qt 中的 Paint() 与 PaintEvent()

python - 如何为 PyQt 提供类似宏的录制功能

c - 如何在 CMake 中导出包?

cmake - cmake中使用qrc编译10MB+资源文件导致堆空间分配失败

c++ - 获取 Qt 对象的大小

c++ - 我们如何通过消息抛出异常?

c++ - QSerialPort 正确发送多行

c++ - 如何使用 CMake 在 C++ 代码中运行 gtest? (未见测试)