You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建并使用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
    }
}

验证步骤

  1. 重新构建并安装SampleLib:在SampleLib的Build目录执行cmake --install .,确保库、头文件、CMake配置文件被安装到正确路径。
  2. 构建SampleProject,此时应不再出现链接错误、头文件引用错误和QML导入错误。

内容的提问来源于stack exchange,提问作者Ricky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:43:11