TinyCC 作为脚本解释器的使用 D语言代码

TinyCC 作为脚本解释器的使用 D语言代码

TinyCC 获取及编译

https://bellard.org/tcc/ 这是代码获取途径
编译直接用 win32目录下的 build-tcc 编译工具进行编译即可,我这里是采用 vs build tools进行的编译
编译命令为 build-tcc.bat -c cl

  • 注: 在windows采用这种方式编译输出为libtcc.dll,程序发布时得确认libtcc.dll同时发布
  • 注:如果使用了C语言得通用库中函数,在程序发布时得附带 libinclude目录.

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值