提问者:小点点

使用cryptopp-cmake和crypto++修改cmakelists.txt项目文件


我正在使用Clion,并尝试在cmakelists.txt文件中使用cryptopp-cmake用于cryptopp,因为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按其应有的方式被复制,但我得到错误***没有规则使目标'_deps/cryptop-build/libcryptop.so',这是'../Hmmenc_client/bin/Hmmenc-client'所需的。 停止。

尽管成功复制了cmakelists.txt,但第一次运行时没有生成libcryptopp.so文件,不幸的是,我需要在CLion中使用“Rebuild Project”选项来生成libcryptopp.so文件,并填充${CRYPTOPP_LIB}变量。

是否可以使Cryptopp的cmakelists.txt文件在第一次运行时影响我的构建并生成libcryptopp.so文件?


共1个答案

匿名用户

如果项目使用add_library创建库,则使用目标名称链接到该库。 在这种情况下不要使用库文件。

根据cryptopp项目的cmakelists.txt,库目标的名称是cryptopp-shared,因此只需与之链接:

target_link_libraries(hmmenc-client PRIVATE cryptopp-shared)

将可执行文件与生成的库文件链接。 因此,您需要确保该文件的生成是在链接可执行文件之前执行的。

在CMake中,操作之间的顺序由目标之间的依赖关系指定。 因此您的可执行文件应该被指定为依赖于作为目标的库。 在CMake中,目标之间的依赖关系由add_dependencies()命令指定。

然而,CMake提供了一种方便的方法,用于链接库,同时指定依赖项。 当链接到库目标(由add_library创建)时:

  1. cmake知道哪个库文件对应于该库目标,因此它使用该文件进行实际链接。
  2. cmake自动调整可执行目标和库目标之间的依赖关系。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(cryptopp-cmake|crypto++|修改|cmakelists.txt|项目|文件)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?