我正在尝试迁移一个 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_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
)
关于c++ - 将 Qt 项目文件迁移到 CMake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39834389/