- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Cmake 构建一个项目并使用 FetchContent
来管理依赖项。由于多种原因,我不能依赖系统范围内安装的包,所以这个包有很大帮助。它允许我做这样的事情:
cmake_minimum_required(VERSION 3.14)
project(dummy LANGUAGES C CXX)
include(FetchContent)
FetchContent_Declare(nlohmann
GIT_REPOSITORY https://github.com/onavratil-monetplus/json
GIT_TAG v3.7.3
)
FetchContent_MakeAvailable(nlohmann)
add_executable(dummy main.cpp)
target_link_libraries(dummy PUBLIC nlohmann_json::nlohmann_json)
现在只要 repo 是一个带有 CMakeLists.txt
的 cmake 项目,它就可以很好地工作。我很乐意对非 cmake 项目使用类似的方法,例如 Botan 库。显然
FetchContent_Declare(botan
GIT_REPOSITORY https://github.com/onavratil-monetplus/botan
GIT_TAG 2.17.2
)
FetchContent_MakeAvailable(botan)
并没有真正完成工作,构建没有运行,因为它不是 cmake 项目。人们会考虑添加
CONFIGURE_COMMAND "<SOURCE_DIR>/configure.py --prefix=<BINARY_DIR>"
BUILD_COMMAND "cd <SOURCE_DIR> && make"
或类似于 declare 命令的内容,但 FetchContent
文档明确指出这些特定参数在传递给 FetchContent
时会被忽略。
现在问题很明显了——如何在这种情况下正确使用 FetchContent
?我正在考虑在 fetchcontent 之后使用 ExternalProject_Add
,但是 fetchcontent 似乎没用(ExternalProject 也可以下载 git repo)。此外,我想在配置时使用 botan 的一些目标(如果有意义的话)。
最佳答案
我遇到了同样的问题。由于 Botan 库在内部不使用 CMake 构建系统,因此我们无法使用 Botan“目标”。但是可以在 CMake 配置时构建 Botan 库并使用库和头文件。这是我的解决方案(最小配置,仅适用于 MS Visual Studio):
cmake_minimum_required (VERSION 3.20)
if(WIN32)
if(NOT (${CMAKE_BUILD_TYPE} STREQUAL "Release"))
message(FATAL_ERROR "This configuration only works for a Release build")
endif()
# set paths
set(BOTAN_LIB_ROOT_DIR "${CMAKE_SOURCE_DIR}/external/botan")
set(BOTAN_LIB_REPOS_DIR "${BOTAN_LIB_ROOT_DIR}/repos")
set(BOTAN_LIB_FCSTUFF_DIR "${BOTAN_LIB_ROOT_DIR}/cmake-fetchcontent-stuff")
set(BOTAN_LIB_INSTALL_DIR "${BOTAN_LIB_ROOT_DIR}-install")
# download and unpack Botan library
include(FetchContent)
FetchContent_Declare(
botan
GIT_REPOSITORY https://github.com/randombit/botan.git
GIT_TAG 2.19.1
PREFIX ${BOTAN_LIB_FCSTUFF_DIR}
SOURCE_DIR ${BOTAN_LIB_REPOS_DIR}
)
set(FETCHCONTENT_QUIET OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(botan)
# find Python3 Interpreter and run build, testing and installation
if(${botan_POPULATED} AND MSVC AND NOT EXISTS "${BOTAN_LIB_INSTALL_DIR}/lib/botan.lib")
find_package(Python3 COMPONENTS Interpreter)
if(NOT ${Python3_Interpreter_FOUND})
message(FATAL_ERROR "Python3 Interpreter NOT FOUND")
endif()
execute_process(
COMMAND ${Python3_EXECUTABLE} configure.py --cc=msvc --os=windows --prefix=${BOTAN_LIB_INSTALL_DIR}
WORKING_DIRECTORY ${BOTAN_LIB_REPOS_DIR}
COMMAND_ECHO STDOUT
)
execute_process(
COMMAND nmake
WORKING_DIRECTORY ${BOTAN_LIB_REPOS_DIR}
COMMAND_ECHO STDOUT
)
execute_process(
COMMAND nmake check
WORKING_DIRECTORY ${BOTAN_LIB_REPOS_DIR}
COMMAND_ECHO STDOUT
)
execute_process(
COMMAND nmake install
WORKING_DIRECTORY ${BOTAN_LIB_REPOS_DIR}
COMMAND_ECHO STDOUT
)
endif()
endif()
add_executable (main "main.cpp")
if(WIN32)
target_include_directories(main PUBLIC "${BOTAN_LIB_INSTALL_DIR}/include/botan-2")
target_link_libraries(main PUBLIC "${BOTAN_LIB_INSTALL_DIR}/lib/botan.lib")
configure_file("${BOTAN_LIB_INSTALL_DIR}/bin/botan.dll"
"${CMAKE_CURRENT_BINARY_DIR}/botan.dll"
COPYONLY
)
install(TARGETS main DESTINATION bin)
install(FILES "${BOTAN_LIB_INSTALL_DIR}/bin/botan.dll" DESTINATION bin)
endif()
关于c++ - FetchContent 与 ExternalProject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65232395/
我正在尝试使用 ExternalProject模块: ExternalProject_Add( googlebenchmark GIT_REPOSITORY "htt
我正在尝试使用 ExternalProject模块: ExternalProject_Add( googlebenchmark GIT_REPOSITORY "htt
我正在使用 CMake 构建跨平台(例如 Linux/Windows)应用程序,该应用程序还使用第三方库作为外部项目。 我知道 MSVC 是一个多配置环境,因此不使用 CMAKE_BUILD_TYPE
我正在使用 Cmake 构建一个项目并使用 FetchContent 来管理依赖项。由于多种原因,我不能依赖系统范围内安装的包,所以这个包有很大帮助。它允许我做这样的事情: cmake_minimum
假设我有以下具有这些依赖项的项目设置: MainProject ├─ Dependency_1 │ └─ Dependency_2 └─ Dependency_2 这些依赖关系在 MainProje
在 ExternalProject_Add cmake 的文档,它提到设置 EP_BASE属性(property)。我已经尝试使用 set 设置它关键字,但它似乎不起作用。 ExternalProje
我正在构建 Google 的 FlatBuffers 作为我自己项目的依赖项,我需要在构建时编译一个模式。我不想使用 BuildFlatBuffers.cmake或 FindFlatBuffers.c
我正在尝试创建一个 super 构建来编译依赖项(zlib、nifticlib 和 boost),然后根据所有这些库编译我的项目。 这是我的 CMakeLists: cmake_minimum_req
当安装目标困惑时,引用 ExternalProjects 可能会很痛苦。因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次 ExternalProjects。 CMake 是否可行以及如何实
当安装目标困惑时,引用 ExternalProjects 可能会很痛苦。因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次 ExternalProjects。 CMake 是否可行以及如何实
构建 CMake 项目时(例如在 Windows 上),我可以通过执行以下命令来执行并行构建: cmake --build . -- /m /m 开关被传递到 msbuild,我得到了并行构建。但是,
我的 CMakeLists.txt 之一中有以下代码: FIND_PACKAGE(sphinxbase) if (${SPHINXBASE_FOUND}) INCLUDE_DIRECTORIE
两天前,我添加了一个外部项目来使用autotools编译一个项目。直到今天为止它一直运行良好...... 我有一个奇怪的错误: CMake Error at /usr/share/cmake-2.8/
我有一个外部项目,它提供了我想用来构建可执行文件的源文件。我目前有如下内容: ExternalProject(myproj) add_executable(myexecutable source.c)
我正在尝试创建一个 CMakeLists,它会自动下载和编译一个库,并将它链接到 Windows 和 Linux 上的另一个项目。为此,我使用了 ExternalProject_Add。下载和编译部分
我已经(大部分)成功地为 googletest 设置了 ExternalProject_Add。但是,我注意到诸如我选择的 C++ 编译器、构建类型等内容不会自动转发到 ExternalProject
我正在尝试使用 ExternalProject_Add 将外部项目作为库添加到我的项目中: ExternalProject_Add( xgboost GIT_REPOS
我正在尝试将现有的 native 库用作 android 项目的一部分。我按照有关将 C 和 C++ 代码添加到 android studio 项目的说明进行操作。我到了我有一个正常工作的 CMake
我有一个具有稍微复杂的构建过程的应用程序,作为 CMake 的新手,我想知道是否有人可以为我提供任何指示。 默认情况下,该应用程序由单个可执行文件组成,该可执行文件是根据 src 和包含文件夹中提供的
我正在处理的项目依赖于 Eigen3。以前,我只是让最终用户在配置步骤中手动指定 Eigen3 header 的路径,但这变得很麻烦,我想从用户身上承担一些责任。我已经设置了一个 CMake 外部项目
我是一名优秀的程序员,十分优秀!