官网教程xmake.io。
从XMake github下载xmake-v2.9.3.win64.zip
,下载后解压到一个地方,再将其添加到系统Path环境变量,比如C:\xmake
。
在VSCode中下载xmake插件。
注意:项目第一次构建时不要在终端中直接输入命令行xmake进行构建,这样构建使用的platform是wondows
且toolchain是MSVC
,第三方库也无法正确下载对应的平台。要么输入完整的命令,要么使用插件提供的按钮操作。
第一次构建后会生成build缓存,之后才可以直接使用xmake命令构建。
# 创建工程
xmake create demo
# 编译
xmake # 或 xmake b
# 运行
xmake r
# 清除缓存
xmake c -a
# 打开可视化配置界面
xmake f --menu
# 生成CMakeLists.txt文件
xmake project -k cmakelists
# 查看某个库的详细信息,以fmt为例
xmake require --info fmt
# 查看xmake安装信息
xmake show
add_rules("plugin.compile_commands.autoupdate", {outputdir = ".vscode"})
add_rules("mode.debug", "mode.release")
set_config("p", "mingw")
set_config("a", "x64")
set_config("m", "release")
set_toolchains("mingw")
target("demo")
set_kind("binary")
add_files("main.cpp")
-- 添加头文件所在目录 (2种方法)
add_includedirs("D:\\Apps\\cpackages\\boost")
add_cxxflags("-ID:/xx1/include -ID:/xx2/include")
-- 链接自定义库
add_ldflags("-LD:/xxx/lib -lgtk-4 -lcairo")
-- 链接系统库
add_syslinks("pthread", "rt")
xmake create -t qt.widgetapp qtdemo
cd qtdemo
xmake f -p mingw -a x68_64 -m debug --sdk=C:/mingw64 --qt=D:/Apps/Qt/5.15.2/mingw81_64
add_rules("mode.debug", "mode.release")
add_requires("qt5widgets")
target("test")
add_rules("qt.widgetapp")
add_packages("qt5widgets")
add_headerfiles("src/*.h")
add_files("src/*.cpp")
add_files("src/mainwindow.ui")
-- add files with Q_OBJECT meta (only for qt.moc)
add_files("src/mainwindow.h")
用VSCode打开项目后,在底部会出现XMake插件提供的一排工具按钮。
Set the target platform
选择mingwchange the toolchain
不选,xmake会自动选择platform对应的默认toolchain(如果选择gcc,会导致下载第三方库时失败)build
,才能运行run
或调试debug
。先编译一遍源码(否则下面生成的compile_commands.json是空文件)。
按Ctrl Shift P
,输入XMake: UpdateIntellisense
,自动生成.vscode/compile_commands.json
文件。
按Ctrl Shift P
,输入C++: Edit Configurations (UI)
,然后关掉,这一步会自动生成.vscode/c_cpp_properties.json
文件。打开这个文件,在对应字段处添加内容"configurations": [{"compileCommands": ".vscode/compile_commands.json"}]
。
在xmake.lua文件中必须要有add_rules("mode.debug", "mode.release")
命令,并选择debug模式编译一遍,然后按F5调试。缺少该命令时,即使底部工具栏显示的是debug,编译出来的也是release模式的可执行程序,打断点后调试无效果。
以fmt为例
在xmake.lua
文件中添加两行命令add_requires("fmt")
和add_packages("fmt")
add_rules("mode.debug", "mode.release")
add_requires("fmt")
target("hello")
set_kind("binary")
add_files("src/*.cpp")
add_packages("fmt")
在构建时,xmake会自动从github上下载该库。
系统库通常都是从系统官方包管理(Linux中的apt、MYSY2的pacman、Mac的homebrew等)下载的包。默认情况下xmake会先去找系统库,如果没有才下载远程包,基本上只有在非Windows平台才需要考虑是否使用系统库,可以通过add_requires
传入参数强制xmake使用系统库。
add_requires("zlib", {system = true})
也可以直接指定想用的系统包
add_requires("brew::zlib", {alias = "zlib"})
add_requires("pacman::zlib", {alias = "zlib"})
add_requires("pkgconfig::zlib", {alias = "zlib"})
add_requires("vcpkg::zlib", {alias = "zlib"})
add_requires("conan::zlib", {alias = "zlib"})
设置了alias参数后,只需要add_packages("zlib")
而不是add_packages("conan::zlib")
。
比如包默认是静态库,我们可以传入configs使其编译成动态库。
add_requires("zlib", {configs = {shared = true}})
在 c/c++ 生态中,每个包都会有自己的编译选项。fmt是一个头文件库,他支持非头文件的方式编译,那么可以传入对应configs来编译成动态库。
add_requires("fmt", {configs = {header_only = false, shared = true}})
add_ldflags("-lws2_32")