C++ Qt6桌面应用程序和与cmake共享的库
我正在尝试使用cmake创建一个包含子目录的项目。 使用qmake时,此机制是在Qt creator中构建的。 该项目包含一个共享库和一个桌面应用程序。 以下是我拥有的项目和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_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)
。