必须在顶级cmakelists.txt中且仅一次调用project(),置于cmake_minimum_required之后,传入纯ascii项目名;可选languages指定语言或enable_language延迟启用;支持version等元信息定义。

要在CMake中正确定义项目基础信息,必须在顶级CMakeLists.txt中调用project()命令——它不光是命名项目,还决定编译器检测行为、语言标准默认值和关键变量生成,漏写或位置错误会导致CMAKE_CXX_STANDARD未生效、PROJECT_SOURCE_DIR为空等隐性故障。
project()的基础写法与强制要求
第一步:把project()放在cmake_minimum_required()之后的第二行,且只能出现一次。CMake不会报错,但重复调用会覆盖前一次定义的PROJECT_NAME等变量,后续target_include_directories中引用${PROJECT_NAME}可能指向错误名称。
第二步:至少传入项目名称参数,例如project(MyApp)。名称中不能含空格或特殊符号,否则在Windows生成VS工程时会触发MSB8066错误。
第三步:名称必须为纯ASCII字符。若使用中文或emoji(如project(我的项目)),CMake 3.10+虽不报错,但生成的Xcode工程会无法加载,Visual Studio则提示“无效的项目标识符”。
CMake 4.3.2 Windows x86_64 历史版本安装包,适合旧项目兼容、构建环境回退、CMakeLists.txt 迁移验证、Visual Studio/Ninja/Makefile 生成器测试和 C/C++ 项目维护。
显式声明编程语言的两种方法
方法一:在project()中直接用LANGUAGES关键字指定
例如project(NetworkTool LANGUAGES CXX CUDA)。这会激活C++和CUDA编译器探测,并自动设置CMAKE_CXX_STANDARD为14、CMAKE_CUDA_STANDARD为14——注意,不写LANGUAGES时CMake默认只启用C和CXX,CUDA支持完全不会触发。
方法二:用enable_language()单独启用(适用于需延迟启用或条件启用场景)project(CoreLib)<br>if(USE_FORTRAN)<br> enable_language(Fortran)<br>endif()。此方式更灵活,但【必须在任何add_executable或add_library之前调用】,否则CMake会跳过Fortran编译器查找,导致fortran源文件编译失败。
版本号与描述信息的实用配置
project(MyApp VERSION 2.1.0 DESCRIPTION "High-performance HTTP client" HOMEPAGE_URL "https://github.com/me/myapp")。VERSION参数会自动定义PROJECT_VERSION、PROJECT_VERSION_MAJOR等变量,供后续逻辑判断使用,比如if(PROJECT_VERSION_MAJOR GREATER_EQUAL 2);而DESCRIPTION和HOMEPAGE_URL仅用于生成IDE工程元数据,不影响构建过程。
版本号中允许带后缀,如VERSION 1.0.0-rc2,此时PROJECT_VERSION_TWEAK为空,但PROJECT_VERSION仍完整保留字符串。若只需主版本控制,直接用VERSION 1即可,CMake会补全为1.0.0。










