Skip to content

v1.5.x编译

ruki edited this page Dec 15, 2015 · 13 revisions

编译

新版本采用全新xmake自动构建框架进行编译,详情参见:

xmake的安装和使用

使用

详细的编译过程见上述的链接,不过一般情况下,编译只需要执行:

xmake 

使用xmake编译完tbox后,可以执行下面的命令,对tbox进行打包:

# 打包输出到默认目录:tbox/build
xmake p

# 打包输出到指定目录
xmake p -o outdir

打包完成后,会在输出目录自动生成一个名叫 tbox.pkg的包,其目录结构如下:

tbox.pkg
.
├── inc
│   ├── android
│   │   └── tbox.config.h
│   ├── iphoneos
│   │   └── tbox.config.h
│   ├── iphonesimulator
│   │   └── tbox.config.h
│   ├── macosx
│   │   └── tbox.config.h
│   ├── windows
│   │   └── tbox.config.h
│   └── tbox
├── lib
│   ├── debug
│   │   ├── android
│   │   │   └── armv7-a
│   │   │       └── libtbox.a
│   │   ├── iphoneos
│   │   │   └── armv7
│   │   │       └── libtbox.a
│   │   ├── iphonesimulator
│   │   │   └── x86_64
│   │   │       └── libtbox.a
│   │   ├── macosx
│   │   │   └── x86_64
│   │   │       └── libtbox.a
│   │   └── windows
│   │       └── i386
│   │           └── tbox.lib
│   └── release
│       ├── android
│       │   └── armv7-a
│       │       └── libtbox.a
│       ├── iphoneos
│       │   └── armv7
│       │       └── libtbox.a
│       ├── iphonesimulator
│       │   └── x86_64
│       │       └── libtbox.a
│       ├── macosx
│       │   └── x86_64
│       │       └── libtbox.a
│       └── windows
│           └── i386
│               └── tbox.lib
└── xmake.lua

每次打包,会把当前指定编译平台的文件放置到对应目录,想要上述平台更加全面,只需要对每个平台都进行编译打包一边就行了。

inc/tbox 为tbox的头文件,inc/windows/tbox.config.h这些是每个平台下的tbox的相关配置头文件,也需要被包含。

所以使用tbox.config.h,有两种方法:

  • 添加一个配置文件的搜索路径,例如inc/windows/,让其能自动找到相关平台对应的tbox.config.h
  • 如果你只需要一个平台,例如windows,那么更简单的方式只需要把inc/windows/tbox.config.h复制到inc/tbox下面就行了

在代码中引用tbox头文件只需要包含一个总的头文件就行了,因为tbox的所有头文件都是相对路径自包含的(除了tbox.config.h),例如:

#include "tbox/tbox.h" 

如何链接库就不多说了,需要注意的一点是,如果当前链接的是debug的版本,那么整个工程里面需要定义一个全局的宏开关:__tb_debug__,这个是必须的,而release版本就不需要任何开关了。

下面给个最简单使用tbox的空工程代码:

#include "tbox/tbox.h" 

int main(int argv, char** argv)
{
    // 初始化整个tbox库环境,这个是必须的,但是只需要在程序最开始执行一下
    if (!tb_init(tb_null, tb_null)) return 0;

    // 打印输出,需要自己加换行符
    tb_printf("hello world!\n");

    // 只在debug下打印输出一行
    tb_trace_d("hello world");

    // 在debug/release下打印输出一行
    tb_trace_i("hello world");

    // debug下进行断言检测
    tb_assert(1 == 1);
    tb_assert_abort(1 != 2);

    // 空等待
    getchar();

    // 退出整个tbox环境,这步会释放tbox占用的所有资源,如果是debug版本,还会在终端输出内存泄露检测信息等等。
    tb_exit();
    return 0;
}

详细的断言和输出使用见:打印输出断言与检测

注:在windows下vs中使用 tbox 需要额外注意的一点是,vs的c编译器只支持c89的语法,而tbox的最低支持标准也是c99以后的,所以用c89的编译器是编译不过的,包含tbox.h的头文件,编译器也会报错。

因此,想要在vs中使用tbox,需要采用c++编译,可以直接在*.cpp的文件中使用tbox,或者在使用tbox的*.c的文件采用/TP选项,强制作为c++来编译。。

###android下tbox的初始化

在android下使用tbox,需要在so库加载的时候初始化tbox,然后把jvm的全局指针传入tbox中,这样整个so库就可以随意使用tbox的任意接口了。。

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved)
{
    // init tbox
    if (!tb_init(jvm, tb_null)) return -1;

    // ok
    return JNI_VERSION_1_4;
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* jvm, void* reserved)
{
    // exit tbox
    tb_exit();
}

###第三方库的检测和编译

tbox依赖的那几个第三方库,大部分就能自动检测通过,有些直接内置在pkg目录下,可以直接检测到,还有些需要自己安装,和设置检测路径

例如macosx下mysql如果安装在:/opt//local/lib/mysql5/ 下面,那么需要执行以下配置,进行检测:

xmake f -p macosx -c --ldflags="-L/opt//local/lib/mysql5/mysql" --cxflags="-I/opt/local/include/mysql5/mysql"

加上-c参数清楚上次配置,强制重新检测,加上ldflags和cxflags编译标志,使得xmake能找到mysql,也就能正常编译了。。

如果觉得每次设置遍比较麻烦,可以将mysql的相关库和头文件,直接放到pkg目录下,就能一直检测通过了。。

Clone this wiki locally