Использование cryptopp-cmake и crypto ++ для соединения файла проекта CMakeLists.txt - PullRequest
0 голосов
/ 03 августа 2020

Я uisng Clion , и я пытаюсь использовать cryptopp-cmake для cryptopp в моем CMakeLists.txt файле , поскольку Cryptopp не имеет файла cmake в своем проекте. Мой CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(my_project)

# Set compiler flags
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to be used")
if(CMAKE_COMPILER_IS_GNUCC)
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion -fopenmp")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")
endif()
# For windows
if(MSVC)
    set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} /W4")
endif()

# Allow multi core usage
set(CMAKE_BUILD_PARALLEL_LEVEL)

include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(-std=gnu++17 STD_CPP_17_SUPPORT)

# Include usage of external projects
include(FetchContent)

# Get the cryptopp CMakeLists.txt file for cryptopp package
set(CRYPTOPP_CMAKE "cryptopp-cmake")
FetchContent_Declare(
        ${CRYPTOPP_CMAKE}
        GIT_REPOSITORY  https://github.com/noloader/cryptopp-cmake
        GIT_TAG         CRYPTOPP_8_2_0
)

FetchContent_GetProperties(${CRYPTOPP_CMAKE})
if(NOT ${CRYPTOPP_CMAKE}_POPULATED)
    FetchContent_Populate(${CRYPTOPP_CMAKE})
endif()


# Get the cryptopp package
set(CRYPTOPP "cryptopp")
FetchContent_Declare(
        ${CRYPTOPP}
        GIT_REPOSITORY  https://github.com/weidai11/cryptopp
        GIT_TAG         CRYPTOPP_8_2_0
)

FetchContent_GetProperties(${CRYPTOPP})
if(NOT ${CRYPTOPP}_POPULATED)
    FetchContent_Populate(${CRYPTOPP})
endif()

# !!! IMORTANT !!! before using add_subdirectory(), include_directories() and set(CRYPTOPP_LIB....) commands.
file(COPY ${${CRYPTOPP_CMAKE}_SOURCE_DIR}/CMakeLists.txt DESTINATION ${${CRYPTOPP}_SOURCE_DIR})
add_subdirectory(${${CRYPTOPP}_SOURCE_DIR} ${${CRYPTOPP}_BINARY_DIR})
include_directories(${${CRYPTOPP}_SOURCE_DIR})
set(CRYPTOPP_LIB ${${CRYPTOPP}_BINARY_DIR}/libcryptopp.so)

# Set some path variables
set(APP_DOMAIN ${PROJECT_SOURCE_DIR}/hmmenc_client)

# Other project path includes
set(PROJECT_EXECUTABLE_PATH ${PROJECT_SOURCE_DIR}/hmmenc_client/bin)
include_directories(${PROJECT_BINARY_DIR}
        ${PROJECT_SOURCE_DIR}
        ${APP_DOMAIN}
        ${PROJECT_EXECUTABLE_PATH}
        )

# my_project header and source files
set(SOURCE_FILES
...
        )

# Build in Release mode by default
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug)
endif()
message(STATUS "Build type (CMAKE_BUILD_TYPE) ${CMAKE_BUILD_TYPE}")

# Executable will be in ../bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_EXECUTABLE_PATH})

add_executable(hmmenc-client
        ${SOURCE_FILES}
        ${APP_DOMAIN}/main.cpp
        )

target_include_directories(hmmenc-client PRIVATE)

# Link the project libraries to the executable
target_link_libraries(hmmenc-client PRIVATE
        ${CRYPTOPP_LIB}
        )

Когда я позволяю ему работать в CLion CMakeLists.txt копируется как он должен, но я получаю сообщение об ошибке *** No rule to make target '_deps/cryptopp-build/libcryptopp.so', needed by '../hmmenc_client/bin/hmmenc-client'. Stop..

Файл libcryptopp.so не создается при первом запуске, несмотря на успешно скопированный CMakeLists.txt и к сожалению, мне нужно использовать опцию «перестроить проект» в CLion для libcryptopp.so , чтобы быть сгенерированным и заполнить переменную ${CRYPTOPP_LIB}.

Является ли способ сделать Cryptopp's CMakeLists.txt эффект моей сборки при первом запуске и сгенерировать файл libcryptopp.so ?

1 Ответ

2 голосов
/ 03 августа 2020

Если проект создает библиотеку с add_library, то связывайтесь с этой библиотекой, используя имя target . В этом случае не используйте библиотеку файл .

Согласно проекту cryptopp CMakeLists.txt , имя целевой библиотеки cryptopp-shared, поэтому просто ссылка на него:

target_link_libraries(hmmenc-client PRIVATE cryptopp-shared)

Подробные объяснения

Вы связываете свой исполняемый файл с файлом библиотеки, который создается. Таким образом, вы должны быть уверены, что создание этого файла выполняется до связывания вашего исполняемого файла.

В CMake порядок между действиями определяется зависимостью между цели . Таким образом, ваш исполняемый файл должен быть указан как зависимый от библиотеки как target . В CMake зависимость между целями указывается командой add_dependencies().

Однако CMake предоставляет удобный способ связи с библиотекой и одновременного указания зависимости. Когда вы связываете с библиотекой target (созданный add_library):

  1. CMake знает, какой файл библиотеки соответствует этой цели библиотеки, поэтому он использует этот файл для фактического связывания.
  2. CMake автоматически регулирует зависимость между исполняемым целевым файлом и целевым объектом библиотеки.
...