码迷,mamicode.com
首页 > 其他好文 > 详细

libtcc源码分析(一)概览

时间:2015-02-03 22:54:00      阅读:4628      评论:0      收藏:0      [点我收藏+]

标签:

关于libtcc

.... libtcc的源码仓库:libtcc

libtcc是一个微型的C编译器,它可以将C源码直接编译成机器码,并且通过libtcc提供的接口函数,在宿主程序里可以很方便的获取到libtcc编译后的函数或变量地址,这样相比其他脚本语言,libtcc就具有了以下的特点:

  • 脚本完全使用c语言编写,对大多数用c语言入门的人来说,几乎没有任何学习成本,但是同样,处理字符串会变得和c一样麻烦
  • 速度,libtcc是直接将源码文件(或者可以说脚本文件)直接编译成机器码的,在编译一次后,再执行脚本就会和Native Code一样快
  • 可以很方便的使用几乎所有的c动态链接库
  • 使用tcc_add_symbol函数可以将宿主程序的变量或函数暴漏给libtcc,使用tcc_get_symbol函数可以将脚本编译后的变量或函数暴漏给宿主程序;在libtcc和宿主程序中使用暴漏处理的符号和使用动态链接库一样方便。

libtcc存在的问题:

  • libtcc不可以在多线程环境下使用
  • 不可以同时使用多个TccState(源码内用到了大量的全局变量)
  • 其他bug见libtcc源码包中的TODO文件

使用libtcc

编译

在windows下直接运行win32/build-tcc.bat即可

使用

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define PAUSE system("pause")
    4. #include "../tinycc/libtcc.h"
    5. const char szCode[] = "\n"
    6. //"//#define MACRO(a, b c) (a+b+c)\n" ///bug1
    7. //"double array[10][20];"
    8. "double add(double a, long b)\n"
    9. "{\n"
    10. " return a+b;\n"
    11. "}\n";
    12. typedef int (*f_iii)(int, int);
    13. void error_in_tcc(void *opaque, const char *str)
    14. {
    15. printf(__FUNCTION__": %s\n", str);
    16. }
    17. int main()
    18. {
    19. int nRet = 0;
    20. TCCState* s1 = tcc_new();
    21. tcc_set_error_func(s1, NULL, error_in_tcc);
    22. tcc_add_library_path(s1, "E:\\learn\\libtcc\\tinycc\\win32\\lib");
    23. //tcc_define_symbol(s1, "MACRO1(a, b)", "b ## a");
    24. //tcc_define_symbol(s1, "MACRO0(a, b c)", "(a+b+c)");
    25. //tcc_set_output_type(s1, TCC_OUTPUT_MEMORY);
    26. nRet = tcc_compile_string(s1, szCode);
    27. if (nRet == -1)
    28. {
    29. printf("compile failed!\n");
    30. PAUSE;
    31. return nRet;
    32. }
    33. tcc_relocate(s1, TCC_RELOCATE_AUTO);
    34. f_iii f = (f_iii)tcc_get_symbol(s1, "add");
    35. if (f == NULL)
    36. {
    37. printf("find symbol failed\n");
    38. PAUSE;
    39. return nRet;
    40. }
    41. int c = f(10, 20);
    42. printf("c = %d\n", c);
    43. PAUSE;
    44. return 0;
    45. }

参考文档





libtcc源码分析(一)概览

标签:

原文地址:http://www.cnblogs.com/fook-ms/p/4271188.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!