xmake使用

 

xmake用法

安装

  • 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