xmake创建c++项目需显式指定语言和模板,正确配置c++标准、头文件路径、依赖链接及工具链作用域。

初始化项目时 xmake create 选错模板会卡在编译失败
新建 C++ 项目不推荐直接手写 xmake.lua,xmake create 能生成合理骨架,但默认模板是 C 项目,C++ 项目必须显式指定语言:
-
xmake create -l c++ -t console myproject:控制台程序(带main()) -
xmake create -l c++ -t static mylib:静态库(不会生成main,避免链接错误) - 漏掉
-l c++会导致xmake.lua里缺失set_languages("cxx17"),后续用到std::optional或结构化绑定就报错 - Windows 下若选
-t shared且没加add_cxflags("/MD"),可能和运行时库冲突,出现 LNK2005
xmake.lua 中 C++ 标准和头文件路径容易配错
C++ 项目不是靠编译器自动推断标准,xmake 默认用 C++14,但现代项目普遍需要更高版本;头文件搜索路径也常被忽略,导致 #include "myheader.h" 找不到:
- 设标准:在
target("xxx")块内加set_languages("cxx17")(别用set_cxxstd("17"),后者只影响编译器参数,不约束语法检查) - 加头文件:用
add_includedirs("src/include", {public = true}),{public = true}表示该路径也透传给依赖它的 target - 如果用了第三方库如 fmt,又通过
add_requires("fmt")引入,add_includedirs不需要再手动加,xmake 会自动注入 - 注意路径是相对
xmake.lua所在目录的,不是源文件所在目录
依赖管理中 add_requires 和 add_packages 混用导致找不到符号
常见现象是编译通过、链接时报 undefined reference to `fmt::v8::print 这类错误,本质是链接阶段没把库拉进来:
-
add_requires("fmt")只声明依赖,不自动链接;必须配合add_packages("fmt")才会把库名、链接路径、链接选项注入当前 target - 正确写法:
add_requires("fmt") target("app") set_kind("binary") add_files("src/main.cpp") add_packages("fmt") - 如果依赖是系统已装的(如 Ubuntu 的
libboost-dev),要用add_requires("boost", {system = true}),否则 xmake 会尝试自己下载编译一份,反而覆盖系统版本 - macOS 上某些包(如
openssl)默认装在/opt/homebrew,需确认xmake require --info openssl输出的 root 路径是否匹配,否则add_packages会静默失败
交叉编译或自定义工具链时 set_toolchains 必须早于 target
想用 clang++ 替代 g++,或为嵌入式平台指定 arm-none-eabi-g++,很多人把 set_toolchains 写在 target 里面,结果完全不生效:
- toolchain 是全局作用域配置,必须写在所有
target外部,例如:set_toolchains("clang") target("app") set_kind("binary") add_files("src/*.cpp") - 自定义 toolchain 文件(如
myarm.lua)要放在项目根目录下toolchains/子目录,并用set_toolchains("myarm")引用 - 如果同时用
add_requires,第三方库也会走同一 toolchain 编译;但部分包(如zlib)可能不支持交叉编译,此时要加{system = true}绕过 - 执行时用
xmake f -p cross -a arm64切平台,但-p cross不会自动加载 toolchain,仍需set_toolchains显式指定
add_packages 漏了,却提示 unknown type name 'string'。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











