我正在使用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文件?
如果项目使用add_library
创建库,则使用目标名称链接到该库。 在这种情况下不要使用库文件。
根据cryptopp项目的cmakelists.txt,库目标的名称是cryptopp-shared
,因此只需与之链接:
target_link_libraries(hmmenc-client PRIVATE cryptopp-shared)
将可执行文件与生成的库文件链接。 因此,您需要确保该文件的生成是在链接可执行文件之前执行的。
在CMake中,操作之间的顺序由目标之间的依赖关系指定。 因此您的可执行文件应该被指定为依赖于作为目标的库。 在CMake中,目标之间的依赖关系由add_dependencies()
命令指定。
然而,CMake提供了一种方便的方法,用于链接库,同时指定依赖项。 当链接到库目标(由add_library
创建)时: