使用CMake+FetchContent引入CLI11报错:No content details recorded for cli11
解决CMake FetchContent使用CLI11时的「No content details recorded for cli11」错误
错误核心原因
这个错误本质是FetchContent的声明与调用不匹配,常见触发场景:
FetchContent_Declare的名称参数和FetchContent_MakeAvailable的参数拼写不一致(CMake对大小写敏感)FetchContent_Declare语句未被执行(比如放在未触发的条件分支里)- 依赖配置顺序错误,导致CMake在链接阶段无法找到已声明的CLI11资源
可复现的错误代码示例
文件结构
. ├── CMakeLists.txt └── app.cpp
错误的CMakeLists.txt
cmake_minimum_required(VERSION 3.14) project(CLI11Test) # 错误:先创建可执行文件,后配置依赖,且存在参数拼写不匹配 add_executable(app app.cpp) include(FetchContent) FetchContent_Declare( cli11 GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git GIT_TAG v2.3.2 ) # 错误:此处用了大写CLI11,和Declare阶段的小写cli11不匹配 FetchContent_MakeAvailable(CLI11) target_link_libraries(app PRIVATE CLI11::CLI11)
app.cpp代码
#include <CLI/CLI.hpp> #include <iostream> int main(int argc, char** argv) { CLI::App app("Test CLI11 App"); std::string name; app.add_option("-n,--name", name, "Your name"); CLI11_PARSE(app, argc, argv); std::cout << "Hello, " << name << "!" << std::endl; return 0; }
修正后的配置方案
正确的CMakeLists.txt
cmake_minimum_required(VERSION 3.14) project(CLI11Test) # 1. 先引入FetchContent模块 include(FetchContent) # 2. 声明CLI11依赖,名称统一用小写cli11 FetchContent_Declare( cli11 GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git GIT_TAG v2.3.2 # 指定稳定版本,避免拉取开发分支导致不稳定 ) # 3. 下载并配置CLI11,参数必须和Declare阶段的名称完全一致 FetchContent_MakeAvailable(cli11) # 4. 创建可执行文件 add_executable(app app.cpp) # 5. 链接CLI11官方定义的目标 target_link_libraries(app PRIVATE CLI11::CLI11) # 可选:指定C++标准(CLI11要求C++11及以上) target_compile_features(app PRIVATE cxx_std_11)
验证步骤
- 删除旧构建目录清除缓存:
rm -rf build - 重新执行构建流程:
mkdir build && cd build cmake .. make - 运行测试程序:
./app --name Test,输出Hello, Test!即为配置成功。
额外注意事项
- 若使用CMake 3.13及以下版本,
FetchContent_MakeAvailable未被引入,需替换为兼容写法:FetchContent_GetProperties(cli11) if(NOT cli11_POPULATED) FetchContent_Populate(cli11) add_subdirectory(${cli11_SOURCE_DIR} ${cli11_BINARY_DIR}) endif() - 始终指定具体的GIT_TAG版本,不要直接使用
main分支,避免依赖版本变更导致构建失败。
内容的提问来源于stack exchange,提问作者Lars Kakavandi-Nielsen
相关产品推荐
相关产品推荐

