安装
- windows
powershell执行
Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content
- linux
bash <(curl -fsSL https://xmake.io/shget.text)
- macOS
brew install xmake
使用
可执行文件
创建
创建一个默认的 c++ 项目
xmake create hello
创建c工程, 名为hello
xmake create -l c hello
工程结构如下
hello/
├── src
│ └── main.c
├── xmake.lua
└── .gitignore
构建
进入项目目录后,执行
xmake
xmake 会自动检测当前平台(如 linux/x86_64)和编译器,并在 build/ 目录下生成产物
构建后查看当前工程结构, 可发现build/linux/x86_64/release/下生成可执行文件hello
- 运行
在hello/执行如下命令之一即可运行可执行文件
xmake run
xmake run hello
库文件
xmake create --language=语言 --template=类型 项目名
创建c++动态库
创建test_api库
xmake create --language=c++ --template=shared test_api
查看test_api/结构
test_api
├── src
│ ├── foo.cpp
│ ├── foo.h
│ └── main.cpp
└── xmake.lua
// foo.h
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_WIN32)
#define __export __declspec(dllexport)
#elif defined(__GNUC__) && ((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
#define __export __attribute__((visibility("default")))
#else
#define __export
#endif
__export int add(int a, int b);
#ifdef __cplusplus
}
#endif
// foo.cpp
#include "foo.h"
int add(int a, int b) {
return a + b;
}
-- xmake.lua
add_rules("mode.debug", "mode.release")
-- 目标文件
target("foo")
-- 类型为动态库
set_kind("shared")
-- 添加源文件
add_files("src/foo.cpp")
-- 目标文件
target("test_api")
-- 类型为二进制
set_kind("binary")
-- 添加依赖
add_deps("foo")
-- 添加源文件
add_files("src/main.cpp")
构建
xmake
构建test_api项目
执行后即在build/linux/x86_64/release/test_api下生成libfoo.so与test_api可执行文件
链接库
xmake.lua增加
-- 链接库名称
add_links("库名")
-- 链接库所在目录
add_linkdirs("目录")
创建项目link_test, 拷贝test_api项目中libfoo.so与foo.h文件, 链接libfoo.so库
修改main.cpp
#include "foo.h"
#include <iostream>
int main(int argc, char** argv) {
std::cout << add(0xFF, 0xAA) << std::endl;
return 0;
}
修改xmake.lua
add_rules("mode.debug", "mode.release")
target("link_test")
set_kind("binary")
add_files("src/*.cpp")
add_links("foo")
add_linkdirs("lib")
构建, 执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:lib/添加库路径, 即可运行
指令
编译指令
- 用于设置 c 语言编译标志
add_cflags()
- 用于设置 c++ 编译标志
add_cxxflags()
- 用于设置链接器标志
add_ldflags()
- 用于添加编译时宏定义
add_defines()
target("myapp")
set_kind("binary") -- 设置目标类型为可执行文件
add_files("src/*.c") -- 添加源文件
-- 添加编译指令
add_cflags("-Wall", "-O2") -- 添加C编译标志
add_cxxflags("-std=c++11", "-O2") -- 添加c++编译标志
add_ldflags("-lm") -- 添加链接器标志这里链接数学库libm
add_defines("MY_DEFINE=1") -- 添加宏定义 MY_DEFINE