xmake光速入门
- 单目录项目可直接在目录下执行xmake,自动分析生成对应的xmake.lua文件编译执行。
- 工程示例:
-3rd -json -include json.h -lib libjson.a -include -cmd cmd.h -src -common common.h common.cpp -cmd cmd.cpp -table table.h table.cc xmake.lua main.cpp -xmake.lua
-- xmake.lua x = "3rd/" -- 全局变量 可以直接在所有目录下的xmake.lua文件中使用 local x2 = "3rd/" -- 局部变量 只能在该xmake.lua使用 target("json") local x3 = "3rd/" -- 局部变量 只能在该target域里使用 set_kind("phony") -- 仅将第三方库封装,不生成任何文件,别的target只需要依赖该对象,无需再手动去link等等 -- x3 .. "/json" 字符串变量连接 也可以不使用变量,少写一行也是一种美~ add_hearderdirs("3rd/json/include", {public = true}) -- 导出头文件查找路径 add_links("json", {public = true}) -- 添加库链接 add_linkdirs("3rd/json/lib", {public = true}) -- 导出链接路径 target("test") set_kind("binary") -- target类型 binary可执行文件,share动态库,static静态库 add_files("src/*.cpp", "src/cmd/*.cpp", "src/commond/*.cpp") -- 添加源文件,模式匹配支持各种后缀,可以填多个参数 add_includedirs("include") -- 添加头文件查找目录 与上述源文件在一起的头文件不需要手动添加,可以自动识别 set_pcxxheader("pch.h") -- 设置预编译头文件 add_syslinks("pthread") -- 添加系统库链接 -- table是别的目录下的target,json是第三方静态库,但我们提供了target("json"),都可以直接依赖 add_deps("table", "json") -- 添加依赖,通过这样的方式继承别的target的属性,将每个子目录封装起来更优雅的描述 includes("src/table") -- table这个target在别的目录下,因为该目录下有xmake.lua所以可以直接包含进来
-- table/xmake.lua target("table") -- 可以直接在这里使用x变量 因为他是全局的,但我们不需要,因为直接依赖json就可以了 set_kind("object") -- 仅生成目标文件被其他target包含 add_files("*.cc") add_includedirs("./", {public = true}) -- 设置public将该路径暴露出去,依赖的target就不需要再去添加该路径
// main.cpp #include "json.h" // 头文件在3rd/json/include下,在json这个target中我们导出了include目录 #include "cmd/cmd.h" // 头文件与源文件不在一起,但我们添加了对应的头文件路径 #include "common.h"
- 生成cpptools插件使用的compile_commands.json到.vscode目录
xmake project -k compile_commands --lsp=cpptools .vscode
- 当我成功编译后对比使用makefile编译出的可执行文件大小变大了10%,不知是哪个参数没搞对。