标签:
.... libtcc的源码仓库:libtcc
libtcc是一个微型的C编译器,它可以将C源码直接编译成机器码,并且通过libtcc提供的接口函数,在宿主程序里可以很方便的获取到libtcc编译后的函数或变量地址,这样相比其他脚本语言,libtcc就具有了以下的特点:
tcc_add_symbol
函数可以将宿主程序的变量或函数暴漏给libtcc,使用tcc_get_symbol
函数可以将脚本编译后的变量或函数暴漏给宿主程序;在libtcc和宿主程序中使用暴漏处理的符号和使用动态链接库一样方便。libtcc存在的问题:
在windows下直接运行win32/build-tcc.bat即可
#include <stdio.h>
#include <stdlib.h>
#define PAUSE system("pause")
#include "../tinycc/libtcc.h"
const char szCode[] = "\n"
//"//#define MACRO(a, b c) (a+b+c)\n" ///bug1
//"double array[10][20];"
"double add(double a, long b)\n"
"{\n"
" return a+b;\n"
"}\n";
typedef int (*f_iii)(int, int);
void error_in_tcc(void *opaque, const char *str)
{
printf(__FUNCTION__": %s\n", str);
}
int main()
{
int nRet = 0;
TCCState* s1 = tcc_new();
tcc_set_error_func(s1, NULL, error_in_tcc);
tcc_add_library_path(s1, "E:\\learn\\libtcc\\tinycc\\win32\\lib");
//tcc_define_symbol(s1, "MACRO1(a, b)", "b ## a");
//tcc_define_symbol(s1, "MACRO0(a, b c)", "(a+b+c)");
//tcc_set_output_type(s1, TCC_OUTPUT_MEMORY);
nRet = tcc_compile_string(s1, szCode);
if (nRet == -1)
{
printf("compile failed!\n");
PAUSE;
return nRet;
}
tcc_relocate(s1, TCC_RELOCATE_AUTO);
f_iii f = (f_iii)tcc_get_symbol(s1, "add");
if (f == NULL)
{
printf("find symbol failed\n");
PAUSE;
return nRet;
}
int c = f(10, 20);
printf("c = %d\n", c);
PAUSE;
return 0;
}
标签:
原文地址:http://www.cnblogs.com/fook-ms/p/4271188.html