将Qt项目文件迁移到CMake

时间:2016-10-03 14:47:17

标签: 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

2 个答案:

答案 0 :(得分:2)

您的cmake项目中存在以下几个问题:

file(GLOB_RECURSE CODE_FILES QtAwesome.cpp)

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

ADD_DEFINITIONS(-DQTAWESOME_LIBRARY)
QtAwesome的代码中没有使用

QTAWESOME_LIBRARY(请参阅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_MOCadd_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。< / p>

清理后,您的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
)

答案 1 :(得分:0)

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

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