-
-
Notifications
You must be signed in to change notification settings - Fork 723
v1.5.x编译
新版本采用全新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目录下,就能一直检测通过了。。