TinyC的VC++版

来源:互联网 发布:偶像大师 知乎 编辑:程序博客网 时间:2024/06/05 10:58

TinyC的VC++版

考虑换成新的脚本,还好还没开始写,感谢:http://hi.baidu.com/seagatecm/blog/item/9e3425cb8378ef16bf09e622.html 转帖啊,又是一年了,一年更新一次。

最近在网上看到有文章介绍Tiny C compiler。感觉这个用来做游戏脚本应该不错,运行时编译出来的是机器码,应该比lua什么的更一些快吧。

从官网上下载了代码,打开一看,没有visual studio的项目文件,只有mingw的。想想又要diy,比较伤脑筋,在google上找找,过了半个小时什么都没找到。
只好看看包里面的代码,其中一个文件libtcc_test.c演示了将tinyc做为脚本的调用方式,宿主程序能通过函数tcc_get_symbol直接获得脚本中定义的c函数,相当的方便。对比一下lua和luaplus那种无语的调用和封装,我都开始考虑要不要将工作中使用到的lua部分全换成tinyc了。

建了一个vs项目开始编译tinyc,在win32这个文件中有一个build-tcc.bat,运行一下生成一个config.h文件。把这个文件加入到代码中,很顺利的就编译通过了。我采用了lib+exe的方式生成了编译程序和库文件,试着编译了一下例子代码,完全正确。

可是实验libtcc_test.c的时候,出问题了,编译出来的程序运行时报:undefined symbol 'printf'。看来是内嵌在里面的c程序找不到链接库,可是为啥Tinyc编译出来的程序能正常运行呢。想不通为什么,继续去google一把,半个小时后啥结论也没找到,看来我总是遇到一些全球罕见的程序问题啊

只能自己来调试一下了,看了在tcc_relocate函数中出的错。printf链接的符号文件被放在msvcrt.def文件里面了,跟踪到读取def的函数pe_load_def_file中,看到文件正确读取了,printf函数也被加入到表中了。最后发现问题在resolve_sym函数的LoadLibrary这里了,他没有能读取msvcrt.def中定义的msvcrt.dll,报错说模块没找到。太奇怪了,这文件不是好好的呆在system32下面吗。

新建了一个项目专门测试了LoadLibrary,无法读取这个dll,改用Multi-Byte编码方式才能读取。原来2005默认的项目文件是unicode的,导致tinyc中加载dll无法成功。最后的结论是:看来求google不如求己啊