c++ xmake使用方法 c++如何使用xmake构建项目

千静酱_7862

千静酱_7862

2026-03-22

961人浏览

原创

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

c++ xmake使用方法 c++如何使用xmake构建项目

初始化项目时 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" 找不到:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 设标准:在 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 显式指定
C++ 项目用 xmake 最容易卡住的地方,其实是依赖链接和 toolchain 作用域——这两个点不满足,编译器报的错往往离真实原因很远,比如明明是 add_packages 漏了,却提示 unknown type name 'string'。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3020

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

249

24

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6619

3

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

2023.11.27

1955

6

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

2023.08.08

876

5

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

2024.05.29

6443

7

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

11985

4

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2024.08.14

5507

7

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2025.12.25

2516

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习