lua使用 tinycc

20 篇文章 1 订阅


1.下载tinycc

http://bellard.org/tcc/

http://repo.or.cz/w/tinycc.git  最新的


2.编译tcc

需要mingw

进入 tinycc/win32

运行build-tcc.bat


win32/libtcc 下面是 libtcc.a 和 libtcc.h

win32 下面是tcc.exe 和 libtcc.dll

include 和lib 目录是 tcc.exe所需要的c运行时库和头文件,必须与tcc.exe在同个目录。

libtcc.dll也必须与tcc.exe在同个目录。


linux下x86_64平台,tcc编译.a需要使用-fPIC,因为lua库luatcclib.so是share object需要链接。


3.使用tcc

程序 表示使用tcc的主程序,代码 表示程序用tcc动态编译的对象。

a.

如果是程序使用libtcc.dll或libtcc.a,那么这个程序同级目录下也需要有 include lib目录 以及 libtcc.dll。
不然就报找不到cruntime头文件定义错误,以及 cannot find library: tcc1的错误。
或者通过tcc_set_lib_path设置含有lib和include文件夹的目录。必须在tcc_new()后 tcc_set_output_type前马上设置。

b.

如果程序使用vs 编译,需要根据 win32/lib/libtcc.def  生成 libtcc.lib,拷到libtcc目录下。命令如下:

lib /machine:ix86 /def:libtcc.def /out:libtcc.lib

这个程序如果使用mingw编译,那么使用libtcc.a就可以链接了。

c.cruntime 头文件

代码中不用加 include "stdio.h"等c runtime头文件。

d.代码使用lib

使用tcc_add_include_path   tcc_add_library_path 添加路径。

代码使用的库的格式和mingw的gcc一样需要.a而不能是.lib。

tcc_add_library(xxx) 添加链接库libxxx.a。


http://forum.osdev.org/viewtopic.php?f=13&t=24703

After a lot of experimenting, I finally found a way to make my linker happy:


tcc -o shell.exe -L$(LIBDIR) -lc $(LIBDIR)/crt0.o shell.o
instead of:
tcc -o shell.exe -L$(LIBDIR) $(LIBDIR)/crt0.o shell.o -lc

我使用liblua.a还是没链接成功,还是找不到符号,只能换dll。

e.代码使用dll

vs使用 dll对应的lib,gcc使用dll对应的a,而tcc使用的是dll对应的def。

How to link

tiny_impdef.exe xxx.dll 生成 xxx.def。

把def文件放到库路径中。

dll还没试过,要么放库路径,要么和libtcc.dll一样是放程序同目录。

所以代码因为要做lua接口c module,就需要使用 lua52.dll,可以采用此方法链接。




4.下载luatcc

http://luatcc.luaforge.net/

http://piratery.net/hg/luatcc/



5.修改luatcc.c

a.loader.lua 改名为 luatcc.lua ,本文件名改为luatcclib.c。仿照luaxml库,为lua包和c module名字上作区分。

b.为了迁移到 Lua 5.2。

luaL_register 改为luaL_newlib

lua_getfenv 改为  lua_getuservalue

lua_setfenv改为 lua_setuservalue

c.删除lua__new函数中lua_newtable(L); /* __index */这行

d. tcc相对于0.9.25, tcc_relocate函数的改动

新的LIBTCCAPI int tcc_relocate(TCCState *s1);

老的LIBTCCAPI int tcc_relocate(TCCState *s1, int size);

老的接口在tcc_relocate_ex中,不作为库接口。不需要自己管理代码remap的空间生成和释放了, 好像0.9.23以前就是这种做法。

所以lua__tcc__relocate函数中,把原来23前的代码拿来用就行了。

e.库接口

luaopen_module函数名改为 luaopen_luatcclib。不然就报error loading module “XXX”  from file



6.修改loader.lua

a.loader.lua 改名为 luatcc.lua

b.

--module(..., package.seeall)
--local luatcc = require(_PACKAGE:sub(1,-2))
local luatcc = require 'luatcclib'

c.最后加上return luatcc

d.search函数是用来动态编译加载c文件的,可以当lua库用。


7. lua2c

把lua代码转为c


测试代码 lua2c没整进来自动使用,在外部转好后拷过来的:

local luatcc = require 'luatcc'
local context = luatcc.new_context()
context:compile([[

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>

static void lc_mul(lua_State * L, int idxa, int idxb) {
  if (lua_isnumber(L,idxa) && lua_isnumber(L,idxb)) {
    lua_pushnumber(L,lua_tonumber(L,idxa) / lua_tonumber(L,idxb));
  }
  else {
    if (luaL_getmetafield(L,idxa,"__mul")||luaL_getmetafield(L,idxb,"__mul")) {
      lua_pushvalue(L,idxa < 0 && idxa > LUA_REGISTRYINDEX ? idxa-1 : idxa);
      lua_pushvalue(L,idxb < 0 && idxb > LUA_REGISTRYINDEX ? idxb-2 : idxb);
      lua_call(L,2,1);
    }
    else {
      luaL_error(L, "attempt to perform arithmetic");
    }
  }
}

/* name: mul
 * function(a, b) */
int lcf1_mul (lua_State * L) {
  enum { lc_nformalargs = 2 };
  lua_settop(L,2);
  
  /* return a * b */
  lc_mul(L,1,2);
  return 1;
}
]])
context:relocate()
local mul = context:get_symbol("lcf1_mul")
print(mul(2, 3))



整个过程应该是: 主程序 -> 使用lua 库载入lua程序 -> lua程序 使用lua2c将 lua代码转为c -> lua程序使用luatcc库编译c代码 -> luatcc使用 tcc库 编译代码 -> 编译的代码需要链接到 lua 库。


TinyCC编译器 <br>发布时间:2007-07-09 12:28 网友评论 0 条 <br>软件大小:419kb<br>软件类别:编译开发<br>点击次数:1<br>软件语言:英文<br>运行环境:Win9X,Me,NT,2000,XP,2003,Unix<br>软件评级:4<br>更新时间:2007年9月7日<br>软件作者:Fabrice Bellard<br>作者网址:Home Page <br>软件授权:免费<br>下载地址:<br><br>软件描述:在下文中,我们说 Tiny C 编译器、Tiny CC、或者 TCC 都是指的这个 Fabrice Bellard 发明的 GNU/Linux 环境下(目前已被移植到Win32环境中)最小的 ANSI C 语言编译器。TCC 的主页在文后的参考资料中列出。在 Debian GNU/Linux 系统中,可以方便的用 apt-get install tcc 来从网络上安装 TCC 编译器。TCC 的主页上提供有给 Red Hat 系统上使用的 RPM 软件包。在微软 Windows 环境下,可以使用 Cygwin 的模拟 UNIX 的开发环境来编译和使用 Tiny C 编译器。TCC 是自由软件,软件许可证是 GNU LGPL,注意不是 GPL。 TCC 最有趣的特性是可以用 UNIX 系统上常见的 #!/usr/bin/tcc 的方式来执行 ANSI C 语言写就的源程序,省略掉了在命令行上进行编译和链接的步 骤,而可以直接运行 C 语言写就的源程序。这样就能做到像任何一种其它的脚本语言比如 Perl 或者是 Python 一样,显著的加快开发步调。可以像 TCC 直接生成经过部分优化的 X86 机器代码。并不需要生成任何虚拟机的二进制代码。据 TCC 作者提供的数据,TCC 的编译速度比 GNU C 编译器在不做任何代码优化工作(gcc -O0)的时候都要快。当然啦,要是让 GCC 做代码优化的话,那么编译速度就更加比不上 TCC 喽。 <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值