基于Tiny C compiler的c脚本混合编程方法

Tcc学习笔记(一) 开篇 TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器。是的,我们就是这么干的。在我们的项目中,粒子系统的运动规则用C语言来描述,然后由TCC动态生成native code运行。这么做既不失效率又保持了较高的动态能力。 阅读详情
 
TCC简要介绍:
TCC 最有趣的特性是可以用 UNIX 系统上常见的 #!/usr/bin/tcc 的方式来执行 ANSI C 语言写就的源程序,省略掉了在命令行上进行编译和链接的步骤,而可以直接运行 C 语言写就的源程序。这样就能做到像任何一种其它的脚本语言比如 Perl 或者是 Python 一样,显著的加快开发步调。可以像编写 Shell 脚本一样的使用 C 语言,随便想一想都觉得是一件奇妙的事情。但是 TCC 还有一些其它的特性呢!
  • TCC 的体积非常小,全部源代码打包压缩以后不到 200 K 字节大小,编译后的 tcc 可执行程序不过 80 K 字节大小。这意味着我们几乎可以在任何场合使用 TCC 提供给我们的编写 C 语言脚本的能力。这其中当然包括硬盘空间十分紧张的环境,比如嵌入式系统和启动软盘等等。
  • 在给 TCC 的源程序中可以使用任何在给 GCC 的源程序中可以使用的动态链接库。TCC 不仅支持标准的 ANSI C 语言,而且也支持 ISO C99 标准和一部分来自于 GCC 的对 C 语言所做的扩展。
  • TCC 直接生成经过部分优化的 X86 机器代码。并不需要生成任何虚拟机的二进制代码。据 TCC 作者提供的数据,TCC 的编译速度比 GNU C 编译器在不做任何代码优化工作(gcc -O0)的时候都要快。当然啦,要是让 GCC 做代码优化的话,那么编译速度就更加比不上 TCC 喽。
  • Libtcc库能够让用户将TCC作为作为动态代码生成的后端,在libtcc.h中有API的说明,libtcc_test.c是使用libtcc的简单例子。Libtcc包含了这样一种思想,用户可以将程序包含在字符串中,然后直接编译,接下来就可以存取全局符号(函数和变量)。
生成LIBTCC:
       由于libtcc是基于linux的,为了能够生成window下的动态连接库,我们先要使用mingw/msys编译,然后用下面的语句生成dll。为了方便msvc使用,还需要再生成lib库用于链接。整个步骤如下:
1) 生成DLL
gcc -O2 -shared -Wall -Wl,--export-all-symbols -mpreferred-stack-boundary=2 -march=i386 -falign-functions=0 -fno-strict-aliasing -DTCC_TARGET_PE -DLIBTCC -o libtcc.dll tcc.c
2) 生成def
pexports libtcc.dll | sed "s/^_//" > libtcc.def
 
3) 从def生成lib
lib /machine:i386 /def:libtcc.def
    由于c语言编程需要头文件和库,我们也需要在发布程序的时候带上include目录和lib目录,然后在主程序中指定该路径。
 
TCC和主程序的配合:
       在我们的程序中,主要把固定的逻辑放在主程序中,而将变化的东西放在tcc脚本中。该程序的基本流程如下:
       按照用户的输入参数打开截包,按照指定的类型将每一个数据报合适的数组片断传给用户写的tcc程序,由tcc程序将处理后的数据传给主函数,由主函数进一步处理,比如写入文件中。
注意到我们需要处理的可能是rtp包,也可能是没有rtp头的包,在输出的时候,有些码流也需要加入额外的处理,比如h261和h263需要调用主程序中的函数进行sbit,ebit的拼接;比如h263+的简单处理,比如h264的流头的添加,比如音频的直接输出。所以我们在主程序和tcc程序间不光要传递变量,还需要传递函数。
下面是大概的代码框架和解释。
主程序:
TCCState *s;
创建新的tcc状态
    s = tcc_new();
    if (!s) {
        fprintf(stderr, "Could not create tcc state/n");
        exit(1);
    }
       添加路径:
       tcc_add_include_path(s,fullinc);
       tcc_add_library_path(s,fulllib);
 
       设置输出方式为内存:
       tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
       编译一个文件到tcc中(其实是读文件到缓冲区,然后调用了tcc_compile_string)
       tcc_compile_file(s,fullpath);
       将变量和函数符号加入到tcc环境中去,这样在tcc中就可以直接使用这些符号
       tcc_add_symbol(s, "encodeflag", (unsigned long)&encodeflag);
       tcc_add_symbol(s,"f",(unsigned long )&f);
       tcc_add_symbol(s,"Enter_H263Decode",(unsigned long)&Enter_H263Decode);
       tcc_add_symbol(s,"writeFile",(unsigned long)&writeFile);
 
       做所有的重定位工作,在tcc_get_symbol之前必须调用
       tcc_relocate(s);
       获取tcc中的函数和变量符号
    tcc_get_symbol(s, &val, "Process");
    Process = (pf_Process)val;
       tcc_get_symbol(s,&val,"withRtp");
       withRtp=(int)(*(int *)val);
       tcc_get_symbol(s,&val,"offset");
       offset=(int)(*(int *)val);
       循环处理每一个数据包
       while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0)
{
       。。。
调用tcc中的处理函数
       Process(&pkt_data[offset],totallen);
}
 
清理tcc环境
tcc_delete(s);
 
TCC程序
#include <stdio.h>
#include <stdlib.h>
 
int withRtp=1;
int offset=54;
unsigned char zero[2]={0,0};
unsigned char h264head[4]={0,0,0,1};
 
extern FILE *f;
extern unsigned char encodeflag;
extern int writeFile(unsigned char *buf,int len);
 
int Process(unsigned char *pt,int len)
{
       if(encodeflag==0 ||encodeflag==1)
       {/*h261或者h263*/
              if((pt[0])&0x7==0)
              {
                     Enter_H263Decode(len,pt,1);
              }
              else
              {
                     Enter_H263Decode(len,pt,0);
              }                  
       }
       else if(encodeflag==2)
       {/*h263+*/
        if((pt[0]==0x04) && (pt[1]==0x00))
        {
                  writeFile(zero,2);
                  writeFile(&pt[2],len-2);
           }
        else if((pt[0]==0x00) && (pt[1]==0x00))
        {
                  writeFile(&pt[2],len-2);               
           }
        else
        {
               printf("not correct 263+ format/n");
        }
                    
       }
       else if(encodeflag==3)  
       {/*raw data*/
              fwrite(pt,1,len,f);
       }
       else if(encodeflag==4)
       {/*mp3*/
              if(pt[0]==0xff && pt[1]==0xfb)
              {
                     writeFile(&pt[4],len-4);
              }
              else
              {
                     printf("not a mp3 header,%02X %02X/n",pt[0],pt[1]);
              }                  
       }
       else if(encodeflag==5)
       {/*h264*/
              writeFile(h264head,4);
              writeFile(pt,len);
       }
       else
       {
              ;
       }    
       return 0;
}
 
 
从上面的例子可以看出,使用tcc,可以很容易的处理数组,毕竟,采用其他脚本语言的话,比如lua,perl等,要想处理数组,要想容易的进行位运算,还是很麻烦的,而且,c语言毕竟是大多数人熟悉的语言,使用起来很方便。
 
TCC(Tiny C Compiler)安装及使用方法 一.TCC简介 Tiny C Compiler(简称TCC, 或Tiny CC)是一个超小、超快的标准C语言编译器。 1.下载地址 http://download.savannah.nongnu.org/releases/tinycc/tcc-0.9.25-win32-bin.zip 2.将下载好的文件,安装到某一文件夹即可。 二.环境变量配置 win10系统下,直接搜索环境变量,点击环境变量,在... 阅读详情

相关推荐

Tiny C Compiler/TCC调用方法与使用说明

    最近用到了开源C编译器TCC,在网上查了些资料,关于调用方法等内容不是十分完整,因此在实践的基础上作了总结,整理了学习笔记。一、编译TCC源代码(版本tcc-0.9.25)1、安装MinGW和MSYSTCC提供的源代码没有VC的工程文件,只有MinGW.c文件,因此可以使用MinGW进行编译。安装方法:从http://prdownloads.sourceforge.net/mingw下载MinGW-5.1.6.exe,这只是一个用于安装的程序,并不是编译器程序。运行该程序后,它会自动下载压缩文件进行

shania_wang的专栏 1万+

使用libtcc

Windows下使用 下载 tcc的 tcc-0.9.25.tar.bz2 解压 进入 win32 目录, 运行 build-tcc.bat 得到 .\libtcc 下的 libtcc.a libtcc.h gcc libtcc_test.c -s libt

jdr64的专栏 1353

c语言编译器tcc 源码,TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己...

Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器.第一课: 安装,试用, 用TCC编译自己最近,在学习编译器技术, 研究了一下TCC, 记录一下。Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器,而且是开源的, 小到只有约100K. (VC, GCC动不动几十M几百M的, 汗)别看它小, 功能还是很强. 可以编译所...

weixin_39583655的博客 2576

恶斗TCC(Tiny C Compiler)

     TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器。是的,我们就是这么干的。在我们的项目中,粒子系统的运动规则用C语言来描述,然后由TCC动态生成native code运行。这么做既不失效率又保持了较高的动态能力。    但是,

歌谣在风中飘舞 2万+

libtcc 动态链接库和头文件

tcc编译的libtcc.dll。编译命令:tcc -shared libtcc.c -DLIBTCC_AS_DLL -DTCC_TARGET_PE -o libtcc.dll -Ic:\tcc\include\winapi -I c:\tcc\include -I. -Lc:\tcc\lib

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 392

Tiny C Compiler最小的C语言编译器

TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己,tcccompiler 最近,在学习编译器技术, 研究了一下TCC, 记录一下。 Tiny C Compiler(简称TCC, 或Tiny CC)是世界上最小的C语言编译器,而且是开源的, 小到只有约100K. (VC, GCC动不动几十M几百M的, 汗) 别看它小, 功能还是很强. 可以编译所有C99标准的AN...

comtoexe 6078

七自由度机械臂逆运动学实战:从几何简化到KDL库高效求解

本文深入探讨了七自由度机械臂逆运动学求解的实战方法。针对冗余自由度带来的挑战,文章对比了两种核心方案:一是利用任务约束进行几何简化,快速求解特定任务;二是基于DH参数法配置KDL库,实现通用高效的数值迭代求解。文中结合宇树H1机器人实例,详细阐述了从模型解析、参数提取到代码实现与验证的全流程,并提供了几何法与KDL库的适用场景对比与避坑指南。

weixin_29044713的博客 630

如何用Tiny C Compiler实现轻量化C开发:从安装到实战的完整指南

Tiny C Compiler(TCC)是一款超轻量级的ANSI C编译器,它以小巧的体积、闪电般的编译速度和强大的兼容性重新定义了C语言开发体验。无论是嵌入式系统开发、快速原型验证还是教学场景,TCC都能提供传统编译器无法比拟的便捷性。本文将带你探索这款"口袋编译器"的核心优势、安装方法和创新应用场景。 ## 🌟 Tiny C Compiler的五大核心优势 TCC之所以能在众多编译器中脱

gitblog_00198的博客 749

从零开始:Basler相机与pylon Viewer的工业视觉入门指南

本文详细介绍了Basler相机与pylon Viewer在工业视觉系统中的入门指南,涵盖硬件连接、软件安装、核心功能解析及实战案例。通过pylon Viewer的全面控制和参数调整功能,帮助新手快速掌握工业视觉检测技术,提升生产效率。

julia4scientist的博客 1133

芒果YOLOv8改进160:姿态估计Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

芒果YOLOv8改进159:OBB旋转检测头Head篇:即插即用|轻量化非对称多级压缩LOADH旋转检测头,原创改进适配YOLOv8高效检测头,检测头新颖改进,全网首发独一份

包括YOLOv5、YOLOv7、YOLOv8等模型改进 810

Tiny C Compiler:无处不在的C脚本编译器

Tiny C Compiler:无处不在的C脚本编译器 tinyccUnofficial mirror of mob development branch项目地址:https://gitcode.com/gh_mirrors/ti/tinycc 项目介绍 Tiny C Compiler(简称TCC)是一款体积小巧、速度极快的ANSI C编译器。它能够在各种环境中编译和执行C代码,例如在救援磁盘上...

gitblog_00219的博客 896

深度强化学习训练结果曲线绘制教程

使用python语言,只调用matplotlib库,绘制训练过程中保存的强化学习训练曲线。模仿经典论文中的训练曲线,多次训练取平均,并绘制出阴影区域。

加斯顿工程师的博客 910

c语言运行脚本磨程序,TCC(Tiny C Compiler)用C语言当脚本例子

今天在我的C代码里面使用tcc当脚本,感觉比lua还爽, lua已经够小巧够精制了, Tiny C Compiler 更小, 速度也比lua要快, 关键是还能直接传指针参数或指针的返回值,就和C的函数调用一样方便,用TCC的好处是,我们可以把不变的代码用C来实现,把经常要改变的逻辑等用TCC来实现,这样以后修改逻辑相关的东西就不需要重新编译程序,用TCC最方便的地方就是直接把指针当参数和返回值在脚...

weixin_36436373的博客 1059

VSCode 中搭建 Python 开发环境

**验证安装**:打开终端(CMD/PowerShell/终端),输入 `python --version`(Windows)或 `python3 --version`(macOS/Linux),显示版本号即成功。- **下载地址**:[Python 官网](https://www.python.org/downloads/)(选择对应系统的最新稳定版,推荐 3.8+)- **调试**:通过 `launch.json` 配置,设置断点后按 `F5` 启动,使用 `F10/F11` 控制流程。

寒寒豆豆软件公司的博客 2532

级联H桥构网型储能SVG系统设计与VSG控制策略研究

随着新能源渗透率不断提高,电力系统惯量和阻尼水平持续下降,传统跟网型控制策略在弱电网条件下的稳定性面临严峻挑战。构网型控制以电压源方式运行,能够为系统提供惯量和频率支撑,成为当前研究热点。本文针对10kV/10Mvar级联H桥构网型储能静止无功发生器(SVG),采用星形连接拓扑结构,设计了基于虚拟同步发电机(VSG)的构网型控制策略。文章从主电路拓扑设计、数学建模、VSG控制策略设计、调制策略、直流电压平衡控制、系统参数设计、仿真建模和硬件实现等八个方面展开系统论述,给出了完整的Simulink仿真模型~~

huanghm88的专栏 346

Tiny C Compiler完整指南:轻量级C语言编译器的终极选择

Tiny C Compiler(简称TCC)是一款革命性的C语言编译器,以其惊人的小巧体积和闪电般的编译速度而闻名。无论你是C语言初学者还是经验丰富的开发者,TCC都能为你的编程工作带来前所未有的便利和效率。 ## 什么是Tiny C Compiler? Tiny C Compiler是一个完全开源的C语言编译器,专为追求极致性能和最小资源占用而设计。与传统的大型编译器不同,TCC能够在极其有

gitblog_00768的博客 980

深度学习图神经网络 (GNN) —— 处理图结构数据(六十九)

本文系统介绍了图神经网络(GNN)的核心概念、主流模型及其应用。主要内容包括: GNN基础:阐述了图结构数据的特性(节点数不定、连接不规则),以及GNN相比CNN/RNN的优势在于处理非欧式空间的图数据。 核心机制:重点讲解了消息传递框架(MPNN),通过聚合邻居信息迭代更新节点表示,并分析了GCN的归一化邻接矩阵计算和GAT的注意力权重机制。 典型模型: GCN:基于归一化邻接矩阵的特征传播 GAT:引入注意力机制区分邻居重要性 GraphSAGE:通过采样解决大图扩展性问题 GIN:理论表达能力最强的图

hello.reader 298

Tiny C Compiler:5个实用技巧助你快速掌握轻量级C语言编译器

Tiny C Compiler(TCC)是一款轻量级C语言编译器,以其超快速的编译速度和小巧的体积著称,非常适合初学者入门C语言编程和嵌入式开发场景。本文将分享5个实用技巧,帮助你快速掌握这个强大工具的使用方法。 ## 技巧1:一键编译运行单文件程序 ⚡️ TCC最令人惊叹的特性之一是能够直接编译并运行C程序,无需单独的链接步骤。只需一个简单命令即可完成从源码到执行的全过程: ```bash

gitblog_00361的博客 965

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Tiny C Compiler终极完整指南:轻量级编译器的完美选择

你是否曾经为传统C语言编译器的庞大体积和缓慢速度而苦恼?Tiny C Compiler(简称TCC)作为一款革命性的轻量级编译器,正是解决这些痛点的完美方案。这款开源工具以其极致的编译速度和微小的资源占用,彻底改变了C语言开发的体验。 ## 🔍 为什么选择Tiny C Compiler? 传统编译器虽然功能强大,但在很多场景下显得过于笨重。TCC的出现填补了这一空白,为开发者提供了更灵活、更

gitblog_00149的博客 887

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Tiny C Compiler:轻量级编译器的极致体验与实战应用指南

Tiny C Compiler(TCC)是一款超轻量级的ANSI C编译器,以其小巧体积、极速编译和跨平台特性著称。作为一款可在救援磁盘等资源受限环境中运行的编译器,TCC让C语言开发变得前所未有的灵活高效,重新定义了嵌入式与脚本化C编程的可能性。 ## ✨ Tiny C Compiler的核心优势 ### 🔹 极致小巧,随处运行 TCC的设计理念就是"小而美",可轻松部署在各类环境中,包括

gitblog_01086的博客 993

termux上编译使用Tiny C Compiler方法及问题

大概是作者想要把数字拼接到字符上去,结果直接写了,我不了解其他的C语言标准可不可以这么做,但显然这里要人工处理一下,加个"%d"然后改一下参数顺序就好了。安装时必须要在root环境,但装好后不用root。之后就是make了,但第二个问题出现了!termux纯命令行编译过程及一些问题。至此,第一个坑出现了,Vim到配置文件。

2201_76049901的博客 671

论文转PPT:nature-skills 一次生成组会汇报稿

Nature Skills 是一个面向科研工作的开源 AI 技能库,其中 `nature-paper2ppt` 负责把科研论文、预印本或阅读笔记转换成中文汇报 PPT。 **它解决什么问题** 读论文、抠图、排版,三步占掉了一次文献汇报的大部分时间。`nature-paper2ppt` 把这条链路收进一次对话:输入 PDF、DOI、arXiv 链接、摘要加图注或结构化笔记,输出 10–16 页

gitblog_00255的博客 709

Tiny C Compiler参考手册

Tiny C Compiler参考手册 译者: 原文: gashero http://bellard.org/tcc/tcc-doc.html 目录 1   简介2   命令行选项 2.1   快速入门2.2   选项摘要 3   C语言支持 3.1   ANSI C3.2   ISOC99扩展3.3   GNU C 扩展3.4 

MyDriverC 5754
上一篇: 电脑屏幕捕获编码设计案例
下一篇: 格式化某个目录下的所有源代码的js代码
matlab2000
博客等级 码龄24年 37粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值