Я пытаюсь разобраться в правилах установки, используя 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 при установке?
в первом cmakelists.txt есть строка «add_executable(${PROJECT_NAME} ${FILES_HEADERS} ${FILES_SOURCES})». Второй «submodules/my-service» создает библиотеку, которая связана с исполняемым файлом в корневом каталоге.
Поэтому я в основном использую библиотеки 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».
Это решило эту проблему для меня.
«он устанавливает .exe только в папку out/install/x64-release/bin» — О чем
.exe
вы говорите? Ваш проект CMake не создает никакого исполняемого файла, он создает только библиотеку (с вызовомadd_library
).