TinyCC 作为脚本解释器的使用 D语言代码
TinyCC 获取及编译
https://bellard.org/tcc/
这是代码获取途径
编译直接用 win32目录下的 build-tcc
编译工具进行编译即可,我这里是采用 vs build tools进行的编译
编译命令为 build-tcc.bat -c cl
- 注: 在windows采用这种方式编译输出为
libtcc.dll
,程序发布时得确认libtcc.dll
同时发布 - 注:如果使用了
C
语言得通用库中函数,在程序发布时得附带lib
和include
目录.
D语言中调用
D代码分为两个部分
libtcc.d
部分为libtcc.h
中的函数定义dtinycc.d
部分为libtcc API
的简单封装- 作为脚本解释器使用时尽量不要使用
main
主函数
以下为简单测试代码
enum helloC2 = `
//#include <tcclib.h>
typedef struct MyStruct
{
unsigned char a1;
unsigned char a2;
unsigned char a3;
}__attribute__ ((aligned (2))) MyStruct;
__attribute__((dllimport))
extern char hello[];
int fib(int n)
{
printf("%s \n", hello);
printf("%d \n", sizeof(MyStruct));
if (n <= 1)
return 1;
else
return fib(n-1) + fib(n-2);
}
`;
import std.experimental.logger;
void main()
{
import tcc.dtinycc;
string hel = "hello123";
extern(C) int function(int ) fib1;
auto mtcc = new cTinyCC();
mtcc.pfInitScript();
mtcc.pfCompileString(helloC2);
mtcc.pfAddSymbol("hello",hel.ptr);
mtcc.pfRelocate();
fib1 = mtcc.pfGetSymbol!(typeof(fib1))("fib");
fib1(1);
info("fib1:", fib1(1));
}
extern(C)
void disErr(void* opaque, in char* msg)
{
import core.stdc.stdio:ssprintf = printf;
ssprintf("error:%s \n", msg);
//error(msg);
}
更多帮助
可以参考函数定义说明,如有不对部分请及时提出
代码获取
https://gitee.com/sdvcn/d-tinyc