【问题标题】:Migrating Qt project file to CMake将 Qt 项目文件迁移到 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 文件并设置了我的源,但我仍然遇到问题

标签: c++ qt cmake qt5


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2017-02-06
      • 2016-07-29
      • 2018-12-18
      • 1970-01-01
      • 2022-01-01
      相关资源
      最近更新 更多