TinyCC 扩展库( 编译器版本 0.9.27 )
此扩展库体积很小,支持发布后生成独立 EXE,
TinyCC 文档: http://bellard.org/tcc/tcc-doc.html
完整头文件下载: http://download.savannah.gnu.org/releases/tinycc/winapi-full-for-0.9.27.zip
创建TCC C语言编译器,
默认头文件目录
默认库目录
TCC根目录,需要的DLL组件目录;
直接编译 C代码为执行文件
直接编译 C代码为执行文件,
必须使用 @path 指定输出的执行文件路径,
可选用 @code 参数指定 C语言 源代码,
如果没有指定 @code 参数,会返回一个对象,
对返回对象的 code 属性赋值则会自动生成 DLL 文件,
可选增加一个或多个参数指定要添加的库文件
直接获取 C函数,
相当于调用 getCdecl 且不指定参数原型,
这种方法获取 C函数 同样会导致自动调用 relocate 函数,
返回函数对象的调用规则与不声明调用API相同
一、传入参数规则:
1、null参数不可省略
2、32位整数类型,小于32位的整数、以及枚举类型都可以直接在API参数中写数值。
3、对于任何数值类型的指针(输出参数)一律使用结构体表示,例如double * v 表示为{ double v }
4、数组使用结构体表示
5、所有结构体传给API的都是指针地址,都是输出参数并增加返回值
返回值默认为int类型
不支持使用 API 尾标改变返回值类型
添加 *.c 源码文件或 *.o, *.obj 文件
此函数返回 tcc 对象自身
添加头文件目录
tccObject.addLib(
"user32",
"kernel32",
"gdi32" /*这几个库默认已添加,这里仅作演示
静态库必须在"\lib\tcc\.res"目录下可找到 lib库名.a 文件
动态库必须在"\lib\tcc\.res"目录下可找到 库名.def 文件,请到tcc官网下载def生成工具
请到tcc官网下载def生成工具
*/
)
添加库目录
添加系统头文件目录
关闭C语言解释器
tccObject.code = /***
#include <stdlib.h>
#include <windows.h>
/*
DLL入口函数,该函数可以有也可以没有。
总之在DllMain最好不要调用API函数.
*/
int stdcall DllMain(void * hinstDLL, unsigned long fdwReason, void * lpvReserved) {
if (fdwReason == 1/*DLL_PROCESS_ATTACH*/ ){
}
return 1;
}
//导出变量
declspec(dllexport) const wchar_t *hello_data = L"(UTF8字面量定义为UTF16字符串)";
//DLL导出函数
declspec(dllexport) void helloW (const wchar_t * msg)
{
MessageBoxW (0, msg, hello_data, MB_ICONINFORMATION);/*DLL导出函数*/
}
***/
编译C源码,
注意只有源码为UTF8编码,才能支持 L"UTF-16字面量" 的C语法
出错则触发onError事件,如果未指定该事件则抛出异常
定义预处理器符号,如果值为 null 则删除该定义.
预处理器符号需要在添加或编译 C 源码前定义才会有效,
如果定义 NDEBUG 为 1,则不编译 assert 函数并可输出较小文件
此函数返回 tcc 对象自身
在C 代码中添加 io_printf
在C 代码中添加 io_printf,
可选用 @bufferSize 指定最大可输出的字节数,默认为512字节,
io_printf 与C函数 printf 的用法相同,
但 io_printf 会调用 aardio 的 io.print 函数输出字符串,
io_printf 可更好地兼容 aardio 控制台以及 UTF-8 编码,
注意只有通过 tcc 扩展库直接执行 C代码才能使用此函数
获取编译后的C函数
可选用参数@2 指定函数原型,语法与声明API相同
如果不指定函数原型,用法与不声明直接调用 API 相同,
如果从未调用过 relocate 则自动调用.
可使用此函数获取函数地址
tccObject.onError = function(msg){
console.log( msg ) /*编译警告或错误会触发此事件
如果不定义此事件,aardio默认弹出对话框或使用控制台显示此信息*/
}
输出文件
输出文件,
@path 参数指定 *.o, *.obj, *.dll 或 *.exe 等输出文件路径,
@code 为可选参数,用于指定C源代码,建议用 UTF-8 编码
重定位
此函数在调用getCdecl()前被自动调用.
编译并执行int main() 入口函数.
可添加任意多个字符串参数
tccObject.setCdecl(
function(){
},
"函数名",
"void()"
)
直接将C函数指针传入tcc
启用所有警告
允许调试,生成的文件较大
可使用此函数添加函数指针
tccBuilderObject.code = /***
#include <windows.h>
declspec(dllexport) int Add( int a,int b )
{
return a + b;/*如果调用 tcc.build 时没有指定 C代码 就可以在这里指定 C代码。 */
}
***/
_TCC_OUTPUT_DLL=3
_TCC_OUTPUT_EXE=2
_TCC_OUTPUT_MEMORY=1
_TCC_OUTPUT_OBJ=4
_TCC_OUTPUT_PREPROCESS=5