Правила установки CMake

Я пытаюсь разобраться в правилах установки, используя cmakepresets и манифест vcpkg. У меня есть проект, который отлично работает в режиме отладки, но в режиме выпуска он не работает, я объясняю это тем, как настроены мои правила установки.

CMkeLists.txt в корневом каталоге:

cmake_minimum_required(VERSION 3.25)project(TestCppHttpImageTransfer VERSION 1.0 LANGUAGES CXX)

#Specify the C++ standard

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

#Required Libraries

find_package(Boost REQUIRED)
find_package(RapidJSON CONFIG REQUIRED)
find_package(OpenCV REQUIRED)

Include submodules directory

add_subdirectory(submodules/my-service)

#Set list of header files
set(FILES_HEADERS "")

#set list of source files
set (FILES_SOURCES"${CMAKE_CURRENT_LIST_DIR}/TestCppHttpImageTransfer.cpp")

#Add the executable for the main project

add_executable(${PROJECT_NAME} ${FILES_HEADERS} ${FILES_SOURCES})

#Set compile definitions

target_compile_definitions(${PROJECT_NAME} PRIVATE
TEST_CONTENT_DIRECTORY = "${CMAKE_CURRENT_SOURCE_DIR}/Data")

#Link necessary libraries to the executable

target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS} MyService)

#Include directories for the executable

target_include_directories(${PROJECT_NAME} PRIVATE
${Boost_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS})

install(TARGETS ${PROJECT_NAME}
        EXPORT ${PROJECT_NAME}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        INCLUDES DESTINATION include)

install(IMPORTED_RUNTIME_ARTIFACTS ${OpenCV_LIBS} DESTINATION bin

CMakeLists.txt внутри каталога submodules/my-service:

cmake_minimum_required(VERSION 3.25)

project(MyService VERSION 1.0 LANGUAGES CXX)

#Specify the C++ standard

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)

#Required Libraries

find_package(Boost REQUIRED)
find_package(RapidJSON CONFIG REQUIRED)
find_package(OpenSSL REQUIRED)

#Ensure Boost Paths exist

find_path(Boost_Asio_FOUND boost/asio.hpp PATHS ${Boost_INCLUDE_DIRS} REQUIRED)
find_path(Boost_Beast_FOUND boost/beast.hpp PATHS ${Boost_INCLUDE_DIRS} REQUIRED)

find_library(OPENSSL_LIB libssl.lib REQUIRED)
find_library(CRYPTO_LIB libcrypto.lib REQUIRED)

#Make sure OpenSSL paths exist.
find_path(OPENSSL_INCLUDE openssl/opensslconf.h REQUIRED)

#Find Protobuf package

if (NOT protobuf_FOUND)
    find_package(protobuf CONFIG REQUIRED)
endif ()

#Add source to this project's library

add_library(${PROJECT_NAME} STATIC
    "include/image_message.pb.h"
    "include/MyService.h"
    "include/MyServiceCommon.h"
    "include/MyServiceSession.h"
    "src/image_message.pb.cc"
    "src/MyService.cpp"
    "src/MyServiceSession.cpp")

#Include directories for the project

target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")

target_include_directories(${PROJECT_NAME} PRIVATE
${Boost_INCLUDE_DIRS}
${OPENSSL_INCLUDE}
${RAPIDJSON_INCLUDE_DIRS})

#Link libraries to the project

target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENSSL_LIB} ${CRYPTO_LIB} protobuf::libprotobuf)

#Google Test

add_subdirectory(external)
add_subdirectory(test)

#Installation rules

install(TARGETS ${PROJECT_NAME}EXPORT ${PROJECT_NAME}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        RUNTIME DESTINATION bin
        INCLUDES DESTINATION include)

Также у меня есть vcpkg.json:

{
  "name": "test-cpp-ui-http-image-transfer",
  "version": "1.0.0",
  "dependencies": [
    {
      "name": "boost-asio",
      "features": [ "ssl" ]
    },
    "boost-beast",
    "rapidjson",
    "protobuf",
    "opencv",
    "pugixml",
    "libzip"
  ]
}

И они настроены в базовой конфигурации Windows в моем cmakepresets.json:

"binaryDir": "${sourceDir}/out/build/${presetName}",
"installDir": "${sourceDir}/out/install/${presetName}",
"toolchainFile": "$env{VCPKG_DIR}/scripts/buildsystems/vcpkg.cmake"

Итак, cmake устанавливает нужные мне зависимости в out/build/x64-release/Debug, и я могу успешно запустить программу в этом каталоге:

введите сюда описание изображения

но когда дело доходит до его установки, он устанавливает только .exe в папку out/install/x64-release/bin. Я попробовал поэкспериментировать с установкой (IMPORTED_RUNTIME_ARTIFACTS ..), как показано в корневом файле cmakelists.txt, который также устанавливает библиотеки opencv в папку bin, но устанавливает их все, а не только те, которые используются, как в out/build/ x64-выпуск/отладка.

Есть ли способ получить те же результаты, что и в out/build/x64-release/Debug при установке?

«он устанавливает .exe только в папку out/install/x64-release/bin» — О чем .exe вы говорите? Ваш проект CMake не создает никакого исполняемого файла, он создает только библиотеку (с вызовом add_library).

Tsyvarev 09.07.2024 13:55

в первом cmakelists.txt есть строка «add_executable(${PROJECT_NAME} ${FILES_HEADERS} ${FILES_SOURCES})». Второй «submodules/my-service» создает библиотеку, которая связана с исполняемым файлом в корневом каталоге.

Jossue M 09.07.2024 16:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поэтому я в основном использую библиотеки vcpkg в своем проекте. Я нашел репозиторий на github, где они используют set(X_VCPKG_APPLOCAL_DEPS_INSTALL ON), который предполагает «Автоматически копировать зависимости в целевой каталог установки для исполняемых файлов. Требуется CMake 3.14.». Это указано в файле scripts/buildsystems/vcpkg.cmake в каталоге установки vcpkg.

Однако у меня это не сработало, и после нескольких попыток я понял, что когда вы используете CMakePresets.json, вам нужно указать значение для этой опции в разделе «cacheVariables» в ваших конфигурациях CMakePresets.json. После этого необходимые мне библиотеки dll vcpkg были установлены в папку «bin».

Это решило эту проблему для меня.

Другие вопросы по теме