C++ Qt6桌面应用程序和与cmake共享的库

C++ Qt6桌面应用程序和与cmake共享的库,c++,qt,cmake,C++,Qt,Cmake,我正在尝试使用cmake创建一个包含子目录的项目。 使用qmake时,此机制是在Qt creator中构建的。 该项目包含一个共享库和一个桌面应用程序。 以下是我拥有的项目和cmake的结构: 主要产品: cmake_minimum_required (VERSION 3.5) project(contractapp) add_subdirectory(contract-core) add_subdirectory(contract-desktop) 桌面应用程序cmake: proje

我正在尝试使用cmake创建一个包含子目录的项目。 使用qmake时,此机制是在Qt creator中构建的。 该项目包含一个共享库和一个桌面应用程序。 以下是我拥有的项目和cmake的结构:

主要产品:

cmake_minimum_required (VERSION 3.5)

project(contractapp)

add_subdirectory(contract-core)
add_subdirectory(contract-desktop)
桌面应用程序cmake:


project(contract-desktop 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)

# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check https://doc.qt.io/qt/deployment-android.html for more information.
# They need to be set before the find_package( ...) calls below.

#if(ANDROID)
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
#    if (ANDROID_ABI STREQUAL "armeabi-v7a")
#        set(ANDROID_EXTRA_LIBS
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
#            ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
#    endif()
#endif()

find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
find_package(contract-core REQUIRED)

set(PROJECT_SOURCES
        main.cpp
        MainWindow.cpp
        MainWindow.h
        MainWindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(contract-desktop
        ${PROJECT_SOURCES}
    )
else()
    if(ANDROID)
        add_library(contract-desktop SHARED
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(contract-desktop
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(contract-desktop PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
共享库cmake:

cmake_minimum_required(VERSION 3.14)

project(contract-core 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 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)

add_library(contract-core SHARED
  contract-core_global.h
  Person.cpp
  Person.h
)

target_link_libraries(contract-core PRIVATE Qt${QT_VERSION_MAJOR}::Core)

target_compile_definitions(contract-core PRIVATE CONTRACTCORE_LIBRARY)

我的问题是桌面应用程序看不到我正在制作的库。

必须将该库复制到应用程序所在的同一文件夹中。否则,每个文件都在自己的文件夹中,应用程序将看不到它。您很可能希望将这两个二进制文件(应用程序和库)的目标文件夹设置为两者的某个公共生成子文件夹。

“我的问题是桌面应用程序看不到库”-请详细说明。您在构建应用程序时是否遇到错误?或者在运行应用程序时是否出现错误?您收到的确切错误消息是什么?当我尝试从库中包含类时,我发现此文件未找到。您对错误消息的描述非常模糊。请显示(添加到问题帖子)您收到的确切错误消息。通过在cmake_模块_路径中不提供“Findcontract core.cmake”,此项目已要求cmake查找“contract core”提供的包配置文件,但cmake未找到。找不到“contract-core”提供的具有以下任何名称的包配置文件:contract-coreConfig.cmake contract-core-config.cmake将“contract-core”的安装前缀添加到cmake_prefix_PATH,或将“contract-core_DIR”设置到包含上述文件之一的目录。如果“contract core”提供单独的开发包或SDK,请确保它已安装。至于
find_package
,则不需要它来定位在项目本身中创建的库。CMake已经知道该项目中的所有库。如果要链接到项目中创建的某个库,只需使用传递到
add_library
调用的目标名称即可。在您的情况下,要将可执行文件链接到库,只需使用
target\u link\u库(contract desktop PRIVATE contract core)