如何创建并使用Qt6库?CMake跨项目引用配置问题求助
Qt6+CMake 可复用库配置问题修正
问题概述
在Qt6+CMake环境下创建可复用库SampleLib,引用它的SampleProject遇到三个核心问题:
- 链接报错:无法打开输入文件'SampleLib.lib'
- 头文件无法按
#include "SampleLib/SampleLib.h"方式引用 - QML中无法导入SampleLib模块并使用SampleRect组件
SampleLib项目修正
1. CMakeLists.txt 关键修改
补充库文件、头文件的安装逻辑,同时将QML文件封装为标准Qt6 QML模块:
cmake_minimum_required(VERSION 3.14) project(SampleLib LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core Quick) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick) # 创建C++静态库 add_library(SampleLib STATIC SampleLib.cpp SampleLib.h SampleLib_global.h ) # 封装QML模块 qt_add_qml_module(SampleLibQml URI SampleLib VERSION 1.0 QML_FILES SampleRect.qml ) include(CMakePackageConfigHelpers) include(GNUInstallDirs) set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} CACHE PATH "头文件安装路径" ) set(SYSCONFIG_INSTALL_DIR ${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME} CACHE PATH "配置文件安装路径" ) set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "库文件安装路径" ) # 配置Config.cmake configure_package_config_file(${PROJECT_NAME}Config.cmake.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake INSTALL_DESTINATION ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME} PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR LIB_INSTALL_DIR) write_basic_package_version_file( ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake VERSION 1.0.0 COMPATIBILITY SameMajorVersion) # 安装Config文件 install(FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake DESTINATION ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}) # 导出库目标,供其他项目find_package使用 install(TARGETS SampleLib SampleLibQml EXPORT SampleLibTargets ARCHIVE DESTINATION ${LIB_INSTALL_DIR} LIBRARY DESTINATION ${LIB_INSTALL_DIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) # 导出Targets文件 install(EXPORT SampleLibTargets FILE SampleLibTargets.cmake NAMESPACE SampleLib:: DESTINATION ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}) # 安装头文件到指定目录,支持#include "SampleLib/xxx.h" install(FILES SampleLib.h SampleLib_global.h DESTINATION ${INCLUDE_INSTALL_DIR}) target_include_directories(SampleLib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}> ) target_link_libraries(SampleLib PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick) target_compile_definitions(SampleLib PRIVATE SAMPLELIB_LIBRARY)
2. SampleLibConfig.cmake.in 修改
添加导入Targets的逻辑,确保find_package能找到库目标:
set(SAMPLELIB_VERSION 1.0.0) @PACKAGE_INIT@ set_and_check(SAMPLELIB_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") set_and_check(SAMPLELIB_SYSCONFIG_DIR "@PACKAGE_SYSCONFIG_INSTALL_DIR@") set_and_check(SAMPLELIB_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@") # 导入库目标 include("${CMAKE_CURRENT_LIST_DIR}/SampleLibTargets.cmake") check_required_components(SampleLib)
SampleProject项目修正
1. CMakeLists.txt 修改
修正find_package路径,链接正确的库目标,并处理QML模块依赖:
cmake_minimum_required(VERSION 3.16) project(SampleProject VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 6.4 REQUIRED COMPONENTS Quick) qt_standard_project_setup() qt_add_executable(SampleProject main.cpp ) qt_add_qml_module(SampleProject URI SampleProject VERSION 1.0 QML_FILES Main.qml ) set_target_properties(SampleProject PROPERTIES MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) # 设置SampleLib的CMake配置文件路径(替换为实际Build/Release路径) set(SampleLib_DIR C:/Users/ItsAMe/Desktop/QTProjects/SampleLib/Build/Release/lib/cmake/SampleLib) find_package(SampleLib REQUIRED) # 链接C++库和QML模块 target_link_libraries(SampleProject PRIVATE Qt6::Quick SampleLib::SampleLib SampleLib::SampleLibQml ) # 确保QML插件被正确导入 qt_import_qml_plugins(SampleProject) include(GNUInstallDirs) install(TARGETS SampleProject BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
2. main.cpp 修改
改为标准头文件引用方式:
#include <QGuiApplication> #include <QQmlApplicationEngine> // 使用标准路径引用头文件 #include <SampleLib/SampleLib.h> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); SampleLib test; QQmlApplicationEngine engine; const QUrl url(u"qrc:/SampleProject/Main.qml"_qs); QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
3. Main.qml 修改
改为导入QML模块URI,而非目录:
import QtQuick import SampleLib 1.0 Window { width: 640 height: 480 visible: true title: qsTr("Hello World") SampleRect { anchors.fill: parent } }
验证步骤
- 重新构建并安装SampleLib:在SampleLib的Build目录执行
cmake --install .,确保库、头文件、CMake配置文件被安装到正确路径。 - 构建SampleProject,此时应不再出现链接错误、头文件引用错误和QML导入错误。
内容的提问来源于stack exchange,提问作者Ricky
相关产品推荐
相关产品推荐

