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

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Правила установки CMake

Сообщение Anonymous »

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

Код: Выделить всё

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-release/Debug.
Есть ли способ получить те же результаты, что и в out/build/x64-release/Debug при установке?

Подробнее здесь: https://stackoverflow.com/questions/787 ... tall-rules
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»