关于编译:关于编译的重要概念总结

回忆初学编程的时候,大部分人都是从C语言开始学起的,除了一些常见的语法和思维,一些基础知识经常被人们疏忽,如果没有及时地进行梳理,可能短时间内没有太大的影响,然而在日后碰到这些问题时仍旧一头雾水。例如C语言是一门编译型语言,编译型语言首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。对于编译型语言,绕不过的就是编译器。 上面提出几个问题,无妨思考一下: 什么是GNU什么是GCC / G++什么是MinGW-w64C++ 规范有哪些?次要区别是什么?Makefile是什么?cmake是什么?如果脑海中没有一个整体的概念框架的话,正如那张图,一个全副武装的骑士,尽管防护的很好,然而对于编译器的基础知识把握的不牢,就像头盔上的一个缝隙,可能下一箭正中缝隙,败下阵来。 上面具体介绍这几个概念: 什么是GNUGNU 是一个打算或者叫静止。在这个旗号下成立了 FSF,起草了 GPL 等。 GNU操作系统是一种由自由软件形成的类 Unix 操作系统,该零碎基于 Linux 内核,指标在于建设一个齐全相容于UNIX的自由软件环境。 过后Unix 零碎开始免费和商业闭源了。针对这一景象,Richard Stallman发动了 GNU 打算,模拟 Unix 的界面和应用形式,从头做一个开源的版本。他本人做了编辑器 Emacs 和编译器 GCC。接下来开发者实现了包含外围的 gcc 和 glibc。然而 GNU 零碎短少操作系统内核。原定的内核叫 HURD,始终完不成。同时 BSD(一种 UNIX 发行版)陷入版权纠纷,x86 平台开发暂停。这时 Linus 为了在 PC 上运行 Unix,在 Minix 的启发下,开发了Linux。当然 Linux 只是一个零碎内核,系统启动之后应用的依然是 gcc 和 bash 等软件。Linus 在公布 Linux 的时候抉择了 GPL,因而合乎 GNU 的主旨。也补救了GNU在这方面的短少,于是合在一起打包公布叫 GNU / Linux。而后省掉了后面局部,变成了 Linux 零碎。实际上 Debian,RedHat 等 Linux 发行版中内核只占了很小一部分容量。 参考:https://www.gnu.org/gnu/gnu-linux-faq.html 什么是GCC / G++GCC(GNU编译器套件):GNU Compiler Collection。能够编译C、C++、JAVA、Fortran、Pascal、Object-C、Ada等语言。 ...

April 3, 2023 · 1 min · jiezi

关于编译:龙智宣布与Incredibuild建立战略合作伙伴关系

近日,龙智发表与当先的减速编译软件提供商Incredibuild建设策略合作伙伴关系。 Incredibuild是一款减速编译工具。凭借其独特的过程虚拟化技术(Vritualized Distributed Processing™),使用户可能轻松地减速代码构建、测试和许多其余耗时的开发工作,可显著进步一系列编译工作和开发工具的性能,缩短开发工夫并放慢产品交付。 龙智是一家DevSecOps研发平安经营一体化解决方案供应商,致力于为中国企业集成寰球受欢迎的工具,并通过个性化的开发帮忙企业量身打造DevSecOps解决方案,助力企业晋升研发管理水平。 在数字化转型的浪潮下,所有企业都须要减速交付。在这样的背景下,单方达成策略单干,旨在帮忙中国企业缩短研发周期,升高研发老本,进步研发效率与品质。 Incredibuild方示意:“咱们很快乐地发表,咱们曾经与龙智公司正式成为合作伙伴。这是一次极具后劲的单干,将使咱们可能利用彼此的专业知识和资源,独特为客户提供更疾速、更高效的解决方案。咱们期待着与龙智的单干获得更大的成就,并为客户带来更优质的体验。" ”通过与Incredibuild建设策略合作伙伴关系,可能进一步欠缺和降级龙智DevSecOps研发平安经营一体化解决方案。Incredibuild的当先技术能减速编译和构建过程,为客户带来更高效的体验。让开发人员可能跨平台、跨行业和跨环境开启麻利。”龙智董事长何明说,“同时,咱们也在不断创新和扩大龙智的DevSecOps解决方案,期待着与Incredibuild独特引领行业实际,帮忙中国企业更好、更快地交付软件。” 龙智将提供Incredibuild产品从征询、计划定制、我的项目配置、施行部署、规范/定制化培训、到运维的一站式服务。 此前,龙智曾经与Atlassian、Perforce、CloudBees、Mend(原WhiteSource)、SmartBear等寰球DevSecOps畛域出名厂商达成单干,为企业提供事务与我的项目追踪软件Jira,企业Wiki与文档协同软件Confluence,版本控制系统Helix Core,动态代码剖析工具Klocwork,动态测试工具Helix QAC,被称为企业版Jenkins的CI/CD平台CloudBees,开源代码平安扫描工具Mend,自动化测试工具TestComplete、ReadyAPI等,并围绕这些工具提供一站式的服务*,包含: 疾速精确地评估、验证规范产品是否满足客户理论业务需要,是否须要插件或二次开发反对等咨询服务;规范培训服务(包含用户应用培训、我的项目配置管理培训、系统管理培训等),也可依据客户的理论需要,针对具体模块的性能,结合实际利用场景等提供定制化培训服务,解决用户痛点;标准化的二次开发培训服务,以及具体业务需要的二次开发服务;基于客户理论业务需要,交付开箱即用的我的项目配置服务;针对规范产品,提供5* 8小时的中文在线技术支持服务;软件版本的部署、降级以及迁徙服务;基于客户需要提供插件举荐、售前介绍、试用、代其与插件厂商沟通等服务,针对市场罕用插件、我司自研插件等还可提供插件演示、培训等服务。*针对不同产品,具体服务内容不同。详情请征询龙智。对于龙智龙智是一家DevSecOps解决方案提供商,专一于软件开发经营一体化畛域十多年,集成DevSecOps、ITSM、Agile治理思路及该畛域的优良工具,提供从产品布局与需要治理、开发,到测试、部署以及运维全生命周期的解决方案,通过业余征询、计划定制、施行部署、专业培训、定制开发等一站式服务,帮忙企业实现软件开发经营一体化,并确保安全防护融入软件研发的整个生命周期中。龙智在日本东京、加拿大滑铁卢、在中国香港和上海均设有办公室,服务寰球客户。 凭借继续深耕、不断创新的精力,龙智的解决方案先后取得了金融、汽车、通信、游戏、互联网、芯片等行业1000多家企业的认可与信赖,被评为“高新技术企业”、“上海市‘专精特新’中小企业”。 对于Incredibuild Incredibuild可显著进步一系列编译工作和开发工具的性能,缩短开发工夫并放慢产品交付。凭借其独特的过程虚拟化技术(Vritualized Distributed Processing ™),使用户可能轻松地减速代码构建、测试和许多其余耗时的开发工作。 Incredibuild受2000多个组织的100000多名用户的信赖,是构建减速的事实标准。Incredibuild为各种商业和外部工具提供解决方案,如Visual Studio编译减速、通用构建工具、测试、代码剖析和自产高吞吐量计算。代码构建、测试、脚本、自产应用程序和间断交付构建都是Incredibuild能够减速的一些过程例子。

February 10, 2023 · 1 min · jiezi

关于编译:python项目编译加密

有些时候处于代码窃密的要求,会须要把python代码进行加密或者编译加密等来实现窃密 原理Python是一种面向对象的解释型计算机程序设计语言,解释个性是将py编译为独有的二进制编码*.pyc文件,对pyc中的指令进行解释执行,然而pyc的反编译非常简单,可间接反编译为源码因为基于虚拟机(解释型语言)的编程语言比方java或者python很容易被人反编译,因而越来越多的利用将其中的外围代码以C/C++为编程语言,并且以*.so文件的模式提供在windows环境上面常常会看到*.dll文件,在Linux环境下常常会看到*.so文件,这两种都是动静库,*.so文件能够称为动态链接库或者共享库,是ELF文件格式,也是一种二进制文件,个别是C或者C++编译进去的尽管目前有一些反编译伎俩能够去反编译so文件,然而如同成果都不怎么样,反编译进去的都是一堆比拟凌乱的C语言代码,咱们是用python编写的程序,所以把Python代码打包成so文件是能够达到加密的要求的 技术依赖开源我的项目Nuitka,采纳Apache-2.0 license协定 装置nuitkapip形式 python -m pip install -U nuitka在Ubuntu22上面应用python3.10是能够胜利装置的,其余操作系统或者python版本如果装置失败 请具体浏览官网nuitka装置文档,外面蕴含了apt,yum模式的装置 单文件编译以下局部来源于nuitka官网文档 创立一个hello.py def talk(message): return "Talk " + messagedef main(): print(talk("Hello World"))if __name__ == "__main__": main()当前目录文件为 $ ll总用量 4.0K-rw-rw-r-- 1 gong gong 133 九月 22 12:52 hello.py开始编译因为之前是采纳pip形式装置的nuitka,所以应用的时候须要带上python -m的前缀 如果是应用apt或者yum等装置的,间接运行nuitka或者nuitka3即可 运行如下命令能够在当前目录上面创立一个hello.bin的文件 $ python -m nuitka hello.py --remove-output....参数解释--remove-output参数示意在生成二进制编译文件之后移除编译构建目录,该目录是编译过程中会应用到,编译完结之后即可删除 运行二进制文件$ ./hello.binTalk Hello World我的项目级别编译上面采纳django我的项目进行演示,出于不便采纳sqlite数据库,生产环境请应用其余数据库 创立示范我的项目$ pip install django -i https://pypi.doubanio.com/simple/$ django-admin startproject hellonuitka$ cd hellonuitka$ python manage.py migrate$ python manage.py runserver查看初始门路树(tree能够通过sudo apt/yum install tree装置) ...

September 23, 2022 · 3 min · jiezi

关于编译:故障分析-MySQL-57-使用临时表导致数据库-Crash

作者:雷文霆 爱可生华东交付服务部 DBA 成员,次要负责Mysql故障解决及相干技术支持。喜好看书,电影。座右铭,每一个未曾起舞的日子,都是对生命的辜负。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 目录背景信息故障剖析问题复现测试日志测试论断参考链接背景信息在 MySQL5.7.30 主从读写拆散环境下,从库在某天呈现了 MySQL crash. 零碎侧: 监控显示该从库主机的内存和CPU资源使用率在故障前后均失常,磁盘IO有2%的iowait(读写200M/s),阐明故障前磁盘存在压力。 服务侧:slow-log 中记录了服务重启前,存在应用了长期表和文件排序的慢 SQL 语句。 Error-log 中记录了服务调用到 btr0btr.cc 文件 的 L2165 行,呈现了 err == DB_SUCCESS 报错。 0x7f2dd49d0700 InnoDB: Assertion failure in thread 139834817316608 in file btr0btr.cc line 2165InnoDB: Failing assertion: err == DB_SUCCESSInnoDB: We intentionally generate a memory trap.InnoDB: Submit a detailed bug report to http://bugs.mysql.com.故障剖析在零碎侧排除了磁盘空间有余和内存不足的因素,服务侧狐疑是慢查问和BUG的起因,之后通过" btr0btr.cc"关键字查找到了一个相似的 BUG 。链接如下: https://bugs.mysql.com/bug.ph...报告的意思是,MySQL 在执行 btr_insert_on_non_leaf_level_func()函数时,写入长期表会导致带有断言的服务解体。 通过查看 btr0btr.cc 文件结尾的正文理解到的起因是: 此文件的调用机制是:对b树行操作或记录所做的所有更改。 L2165 行操作内容是:在解决插入到非叶级别的内容时,会查看每个级别的可用空间(需保留2倍索引数高度的页空间),如果在操作之前,叶决裂曾经开始,就很难撤销,只能通过解体进行前滚。该 BUG 只会在 MySQL5.7 呈现 ...

May 13, 2022 · 4 min · jiezi

关于编译:南京大学编译实验-Lab-3-自动测试脚本NJU编译原理课程-C-语言实验的-irsimpyc-虚拟机小程序自动化执行

南京大学编译试验 Lab 3 自动测试脚本文章版权属于 法华寺中班小屁孩 @ 博客园 (也就是我),未经作者容许,禁止转载。文章地址 https://www.cnblogs.com/stupi...GitHub: StupidPanther本文将贴出用于编译试验3的自动测试脚本源码。 波及版权,本文将不会提供 irsim.pyc 虚拟机小程序和任何官网测试样例。 脚本的运行须要配置python3等环境,置信对于大家来说不是问题,后文也会对环境配置给予探讨。 OK,进入正题。首先明确,本脚本判断测试是否正确的规范 是:执行你的编译器编译失去的IR程序,是否能产生预期的输入。 本地文件构造应用脚本自动测试,须要依照如下所示组织本地文件构造: .├── auto_run_irsim.py # 与运行irsim.pyc相干的脚本├── run.py # 自动化测试脚本,即你要执行的脚本├── irsim.pyc -> /home/me/Compiler/irsim/irsim.pyc # 链接到irsim.pyc的软链接├── expects # 你冀望的输入(即执行C--编译器输入的IR文件所冀望的输入)│   └── doc.1.1.expect├── inputs # 测试样例(用C--语言编写)│   └── doc.1.1.cmm├── irs # 编译测试样例失去的IR文件(该文件夹无需事后新建)├── outputs # 执行IR程序的理论输入(该文件夹无需事后新建)└── texts # 执行IR程序所对应的stdin(即执行IR程序时本须要手工输出的数据) └── doc.1.1.textrun.py和auto_run_irsim.py的代码将在稍后贴出。接下来将会解释inputs,texts,expects文件夹中的文件应如何筹备(即如何筹备测试样例)。 筹备测试样例须要筹备好inputs,texts,expects文件夹。 inputs文件夹:C--语言源程序无需多说,C--语言源程序合乎试验手册要求即可。须要留神,inputs文件夹中的文件名(不含后缀)须要与texts和expects文件夹中对应的文件雷同,正如上文中的文件结构图所示。 上面给出一个示例:doc.1.1.cmm。 int main(){ int a; int b; read(a); b = a + 1; write(b); return 0;}texts文件夹:执行IR程序须要的stdin内容(即本需手工输出的数据)C--语言源程序中如果调用了read函数,那么,在执行其对应的IR时,须要手工输出数据,这里将本应手工输出的数据写在texts文件夹中后缀为.text的文件中。 留神:每个数据均以换行符完结,文件的后缀必须为.text。 ...

May 6, 2022 · 4 min · jiezi

关于编译:hyengine-面向移动端的高性能通用编译解释引擎

简介:手机淘宝客户端在历史上接过多种多样的脚本引擎,用于反对的语言包含:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickjs 等多个。泛滥的引擎会面临独特面临包大小及性能相干的问题,咱们是否能够提供一套计划,在能反对业务需要的前提下,用一个引擎来反对尽可能多的语言,能较好的兼顾包大小较小和性能优异。为了解决这个问题,咱们开始了 hyengine 的摸索。 作者 | 知兵起源 | 阿里技术公众号 一 背景简介手机淘宝客户端在历史上接过多种多样的脚本引擎,用于反对的语言包含:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickjs 等多个。泛滥的引擎会面临独特面临包大小及性能相干的问题,咱们是否能够提供一套计划,在能反对业务需要的前提下,用一个引擎来反对尽可能多的语言,能较好的兼顾包大小较小和性能优异。为了解决这个问题,咱们开始了 hyengine 的摸索。 二 设计简介"有hyengine就够全家用了" - hyengine是为对立挪动技术所需的各种脚本语言(wasm/js/python 等)执行引擎而生,以轻量级、高性能、多语言反对为设计和研发指标。目前已通过对 wasm3/quickjs 的 jit 编译及 runtime 优化,以极小包体积的代价实现了 wasm/js 执行速度 2~3 倍的晋升,将来将通过实现自有字节码和 runtime 减少对 python 及其他语言的反对。 注:因为以后手机绝大多数都已反对 arm64,hyengine 仅反对 arm64 的 jit 实现。 注:因为 ios 不反对 jit,目前 hyengine 只有 android 版本。 hyengine 整体分为两大块,编译(compiler)局部及引擎(vm)局部。 compiler 局部分为前端、中端、后端,其中前端局部复用现有脚本引擎的实现,比方 js 应用 quickjs,wasm 应用 emscripten,中端打算实现一套本人的字节码、优化器及字节码转换器,后端实现了 quickjs 和 wasm 的 jit 及汇编器和优化器。 vm 分为解释器、runtime、api、调试、根底库,因为人力无限,目前VM暂无残缺的自有实现,复用quickjs/wasm3 的代码,通过实现一套本人的内分配器及gc,和优化现有runtime实现来晋升性能。 业务代码(以wasm为例)通过下图所示的流程,被编译为可执行代码: ...

January 6, 2022 · 17 min · jiezi

关于编译:程序人生-Makefile-常用模板-静态链接库动态链接库可执行文件

本文首发于 2014-07-10 11:51:10前言本文把 makefile 分成了三份:生成可执行文件的 makefile,生成动态链接库的 makefile,生成动态链接库的 makefile。 这些 makefile 都很简略,个别都是一看就会用,用法也很容易,只须要把它们拷贝到你的代码的同一目录下,而后就能够用 make 来生成指标文件了。 上面是三个makefile的源代码:  生成可执行文件的 makefile##############################################################################source file#源文件,主动找所有.c和.cpp文件,并将指标定义为同名.o文件SOURCE := $(wildcard *.c) $(wildcard *.cpp)OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) #target you can change test to what you want#指标文件名,输出任意你想要的执行文件名TARGET := test #compile and lib parameter#编译参数CC := gccLIBS :=LDFLAGS :=DEFINES :=INCLUDE := -I.CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H #i think you should do anything here#上面的基本上不须要做任何改变了.PHONY : everything objs clean veryclean rebuild everything : $(TARGET) all : $(TARGET) objs : $(OBJS) rebuild: veryclean everything clean : rm -fr *.so rm -fr *.o veryclean : clean rm -fr $(TARGET) $(TARGET) : $(OBJS) $(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)生成动态链接库的 makefile############################################################################## #target you can change test to what you want#共享库文件名,lib*.aTARGET := libtest.a #compile and lib parameter#编译参数CC := gccAR = arRANLIB = ranlibLIBS :=LDFLAGS :=DEFINES :=INCLUDE := -I.CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H #i think you should do anything here#上面的基本上不须要做任何改变了 #source file#源文件,主动找所有.c和.cpp文件,并将指标定义为同名.o文件SOURCE := $(wildcard *.c) $(wildcard *.cpp)OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) .PHONY : everything objs clean veryclean rebuild everything : $(TARGET) all : $(TARGET) objs : $(OBJS) rebuild: veryclean everything clean : rm -fr *.o veryclean : clean rm -fr $(TARGET) $(TARGET) : $(OBJS) $(AR) cru $(TARGET) $(OBJS) $(RANLIB) $(TARGET)生成动态链接库的 makefile############################################################################## #target you can change test to what you want#共享库文件名,lib*.soTARGET := libtest.so #compile and lib parameter#编译参数CC := gccLIBS :=LDFLAGS :=DEFINES :=INCLUDE := -I.CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_HSHARE := -fPIC -shared -o #i think you should do anything here#上面的基本上不须要做任何改变了 #source file#源文件,主动找所有.c和.cpp文件,并将指标定义为同名.o文件SOURCE := $(wildcard *.c) $(wildcard *.cpp)OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) .PHONY : everything objs clean veryclean rebuild everything : $(TARGET) all : $(TARGET) objs : $(OBJS) rebuild: veryclean everything clean : rm -fr *.o veryclean : clean rm -fr $(TARGET) $(TARGET) : $(OBJS) $(CC) $(CXXFLAGS) $(SHARE) $@ $(OBJS) $(LDFLAGS) $(LIBS)欢送关注我的微信公众号【数据库内核】:分享支流开源数据库和存储引擎相干技术。 ...

September 25, 2021 · 2 min · jiezi

关于编译:第39问如何编译-MySQL-的调试版本

问咱们在第16问中应用过 mysql 内置的调试版本 mysqld-debug ,但有些 MySQL 版本中没有内置的调试版本. 这次介绍一下如何编译一个调试版本 试验咱们先筹备一个装置了 docker 的环境, 之所以用容器, 是因为咱们在进行各种试验后, 能够将容器毁掉重建, 放弃零碎环境洁净对立, 十分便当. 首先开启一个 devtoolset 容器: 确认本人在容器内: 下载 MySQL 源码包并解压: 接下来装置依赖包, 一共分为 3 类依赖: 编译用的工具, MySQL 的依赖包, 以及开启 DTRACE 调试性能用的依赖包 (DTRACE 调试性能 咱们当前会介绍) 创立一个 build 目录, 之后 MySQL 会将编译的过程文件和后果都放在这个文件夹里: 对编译进行配置: 在一大段输入后, 能够看到配置胜利的信息: 当初能够正式编译了: 通过漫长的五彩斑斓的输入, 编译顺利胜利: 在 build/sql 文件夹中, 曾经造成了调试版的 mysqld : 小贴士 如何像官网一样编译正式的 MySQL ? 在配置环节, cmake 命令中, 将 -DWITH_DEBUG=1 换成 -DBUILD_CONFIG=mysql_release 即可 ...

June 18, 2021 · 1 min · jiezi

关于centos7:20200323-Centos7下当前最高版本python392源码编译安装方法

2020-03-23 Centos7下以后最高版本python3.9.2源码编译装置办法日期作者版本备注2021-03-22dingbinV1.0 本文概要记录Centos7下python3.9.2源码编译装置办法。操作日期: 2021-03-23.操作环境:CentOS Linux release 7.5.1804, 16核 20G具体操作办法如下:官网下载以后最新最高版本python release包:Python-3.9.2.tar.xz编译装置:Python-3.9.2.tar.xztar xvf Python-3.9.2.tar.xz cd Python-3.9.2./configure --prefix=/home/xx/app/python39 --enable-shared --enable-optimizations #留神:--enable-shared 十分重要,因为这个选项会编译出动静python链接库,供其余程序调用,比方编译vim大牛补全插件YouCompleteMe或Vim高版本时,就依赖动静python链接库。 此时必须要加--enable-shared 这个选项,否则python须要从新编译装置。make PROFILE_TASK=" -m test.regrtest --pgo -j14 " -j14make install全副过程大概10分钟左右实现。 精要配置python 将/home/xx/python39/ 退出~/.bashrc 中PATH环境变量cd /home/xx/python39/binln -sf pip3 pipln -sf easy_install-3.9 easy_install3ln -sf easy_install-3.9 easy_installln -sf python3.9 pythonvim ~/.pip/pip.conf退出如下内容:[global]timeout = 10000index-url=http://pypi.douban.com/simpleextra-index-url=http://mirrors.aliyun.com/pypi/simple/#extra-index-url=https://pypi.tuna.tsinghua.edu.cn/simple/#extra-index-url=http://pypi.mirrors.ustc.edu.cn/simple/[install]trusted-host=pypi.douban.com#trusted-host=mirrors.aliyun.com#trusted-host=pypi.tuna.tsinghua.edu.cn#trusted-host=pypi.mirrors.ustc.edu.cn保留退出。pip install virtualenv virtualenvwrapperpip --upgrade install pipvim ~/.bashrc 退出:export WORKON_HOME=${HOME}/.virtualenvsexport PROJECT_HOME=${HOME}/work/projects/pythonprojects.gitexport VIRTUALENVWRAPPER_PYTHON=${PYTHON39_HOME}/bin/pythonsource ${PYTHON39_HOME}/bin/virtualenvwrapper.s保留退出。从新source ~/.bashrcworkon 能够看目前有哪些虚构python环境,workon xxx 进入某个虚构python环境mkvirtualenv -p ~/app/python39/bin/python --copies newvenv1 创立某个虚构python环境名叫newvenv1deactivate 退出以后环境操作示例如下图所示: ...

March 23, 2021 · 1 min · jiezi

关于编译:手撸golang-行为型设计模式-解释器模式

手撸golang 行为型设计模式 解释器模式缘起最近温习设计模式拜读谭勇德的<<设计模式就该这样学>>本系列笔记拟采纳golang练习之 解释器模式解释器模式(Interpreter Pattern)指给定一门语言,定义它的文法的一种示意,并定义一个解释器,该解释器应用该示意来解释语言中的句子。解释器模式是一种依照规定的文法(语法)进行解析的模式,属于行为型设计模式。(摘自 谭勇德 <<设计模式就该这样学>>)场景某业务零碎, 随数据量减少, 数据库拜访压力日渐增大业务team心愿平台team提供通明的缓存解决方案以缓解数据库压力平台team经重复探讨钻研, 决定采纳解释器模式, 间接拦挡/解析/执行SQL(子集)语句, 提供透明化缓存服务SQL(子集)文法SQL: select + FIELD_LIST + from TABLE_NAME + (where BOOL_EXPRESSION)? FIELD_LIST: * | COLUMN_LIST COLUMN_LIST: COLUMN_NAME + (,COLUMN_NAME)* COLUMN_NAME: IDENTIFIER IDENTIFIER: [_a-zA-Z] + [_a-zA-Z0-9]*TABLE_NAME: IDENTIFIER BOOL_EXPRESSION: STRING_FIELD = STRING_LITERAL | STRING_FIELD <> STRING_LITERAL | STRING_FIELD like STRING_LITERAL | STRING_FIELD not like STRING_LITERAL | INT_FIELD = INT_LITERAL | INT_FIELD <> INT_LITERAL | INT_FIELD > INT_LITERAL | INT_FIELD >= INT_LITERAL | INT_FIELD < INT_LITERAL | INT_FIELD <= INT_LITERAL | ( + BOOL_EXPRESSION + ) | BOOL_EXPRESSION and BOOL_EXPRESSION | BOOL_EXPRESSION or BOOL_EXPRESSION STRING_FIELD: IDENTIFIER INT_FIELD: IDENTIFIER STRING_LITERAL: \' + [^"]* + \' INT_LIETRAL: [1-9] + [0-9]*设计IDatabase: 数据库接口IDataTable: 数据表接口IDataRow: 数据行接口IDataField: 数据字段接口IRowFilter: 数据行过滤器接口tEmptyRowFilter: 动态为true/false的行过滤器tExpressionRowFilter: 基于布尔表达式的行过滤器Tokens: SQL(子集)记号枚举Nodes: SQL(子集)语法树节点枚举Chars: 词法剖析辅助类ISQLParser: SQL(子集)词法分析器接口Lexer: 词法剖析实现Parser: 语法分析实现, SQL(子集)解释器的外围tTokenQueue: 词法节点队列tArrayStack: 基于数组实现的LIFO堆栈IBoolExpression: 布尔表达式接口tFieldExpression: 基于字段计算的布尔表达式tLogicExpression: 基于关系(AND/OR)计算的布尔表达式SaleOrder: 销售订单实体类ISaleOrderService: 销售订单服务接口, 继承自IDataTable接口tMockDatabase: 虚构的数据库服务, 实现IDatabase接口tMockSaleOrderService: 虚构的销售订单服务, 实现ISaleOrderService接口单元测试interpreter_pattern_test.go, 模仿销售订单的保留与SQL查问 ...

February 13, 2021 · 14 min · jiezi

关于编译:多媒体开发7编译Android与iOS平台的FFmpeg

编译FFmpeg,一个古老的话题,但我还是介绍一遍,就当记录。之前介绍怎么给视频增加水印时,就曾经提到FFmpeg的编译,并且在编译时指定了滤镜的性能。 然而,在手机流行的时代,你可能更须要的是能在iOS或Android平台上运行的FFmpeg,而对于命令行的ffmpeg,你能够在个人电脑下面应用(因为它简洁易操作),也能够在服务程序中应用(装置FFmpeg后间接调用ffmpeg命令),比方小程常常在本人的mac机上应用ffmpeg命令。 本文介绍怎么编译出iOS或Android平台应用的FFmpeg链接库。 正如编译macos平台应用的FFmpeg一样,编译iOS或Android平台应用的FFmpeg,主线也是先configure再make,只不过,有更多的细节须要思考。 我应用的是macos零碎,以下介绍的就是在mac上穿插编译,编译出挪动平台应用的FFmpeg。 (1)编译环境筹备pkg-configFFmpeg在编译时常常应用到第三方库(比方x264、rtmp等),编译器在查找这些第三方库的头文件与库文件时,须要应用到程序pkg-config。 pkg-conifig给编译器提供门路与链接选项。第三方库在make install时会生成pc后缀的文件并拷贝到系统目录,而pkg-config就是从这个pc文件读取出门路信息。 能够设置PKG_CONFIG_PATH这个环境变量,指定目录,让pkg-config到这个目录上面去找pc文件,如果不设置,则默认在/usr/local/lib/pkgconfig目录上面查找,比方某个时刻我的pkgconfig目录上面是这样的一堆pc文件: 这样装置pkg-config: brew install pkg-config装置pkg-config后,能够这样获取第三方库的门路信息: pkg-config --cflags --libs freetype2以下是对于pkg-config命令的一个载图: 须要留神,尽管pkg-config查找到的pc文件外面有记录到第三方动态库的门路,但理论在编译FFmpeg动态库时,并不会链接上这个第三方库,而且在FFmpeg的编译脚本中能够指定第三方库的门路。 freetype此项只在应用滤镜性能时须要装置。 如果编译时遇到这样的提醒:freetype2 not found using pkg-config,那阐明还没有装置freetype,这样装置即可: brew install freetypeclang编译器此项只在编译iOS平台的FFmpeg时才须要。 因为我的mac机曾经装置过xcode,所以clang曾经存在。如果你的mac还没有装置clang的话,那倡议把xcode装置好。 asm编译器此项只在编译iOS平台的FFmpeg时才须要。 x264或FFmpeg等,都有汇编代码,编译这些汇编代码,须要应用更先进的编译脚本来解决,而mac零碎没有这样的脚本。 这个脚本是gas-preprocessor.pl。 能够这样下载并应用gas-preprocessor.pl: git clone git://github.com/mansr/gas-preprocessor.gitsudo cp -f gas-preprocessor/gas-preprocessor.pl /usr/local/bin/chmod +x /usr/local/bin/gas-preprocessor.plyasm另一个须要的工具是yasm汇编编译器,能够这样装置: brew install yasmNDK工具包此项只在编译Android平台的FFmpeg时才须要。 能够应用ndk-r9d版本,或者最新的版本,来编译FFmpeg,下载地址: https://developer.android.goo... (2)FFmpeg源码下载git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg(3)编译脚本不用本人重写了,找开源的我的项目过去批改一下(留神开源协定)就能够了,比方参考这个开源我的项目: https://github.com/yixia/FFmp... 在这个我的项目外面,有编译Android跟iOS平台的相应脚本,而且有相应的优化解决。在挪动平台应用的库都很重视两个货色,一个是性能,另一个是体积大小。一个好的脚本,既要依据不同的硬件类型作编译上的优化,也要依据软件需要裁剪FFmpeg的性能使得进去的库尽可能小(毕竟FFmpeg的性能并非全副都用上)。 (4)脚本批改小程先介绍一下脚本外面的一些要害参数,这些参数并非平台通用。 指定指令集: --extra-cflags='-arch armv7s' --extra-ldflags='-arch armv7s'指定cpu类型: --arch=arm --cpu=cortex-a9留神,应该依据不同的指令集应用不同的cpu优化;--arch=arm64,像这样指定具体指令架构也是能够的。 指定零碎: --target-os=darwin指定sdk: --sysroot=/Applications/Xcode.app/.../xxx.sdk指定编译器: --cc=xxx/clang指定库生成目录: --prefix=build指定应用的muxer/demuxer/encoder/decoder等: --enable-muxer=mp4基本上应用下面介绍的脚本就能够编译了,但有时候也能够作一些批改,比方要退出第三方库时,或者要对某个指令集作优化时,等等。 小程再提一些留神点,有可能帮你解决编译过程中遇到的问题: --sysroot须要指定。iOS平台为....sdk/,不包含usr/inclue;Android平台是编译链的目录。extra-cflags跟extra-ldflags要指定-arch(iOS)或-march(Android)。在xcode8.3.2(sdk为10.3)上,armv7/armv7s/arm64不能应用"-mfloat-abi=hard"选项,并且arm64要指定-mcpu=cortex-a53。在xcode9.2(sdk为11.2)上,须要--disable-asm。对于理论我的项目来说,FFmpeg的编译是要害的一步,应该多花工夫去钻研一些要害的细节--性能、性能跟体积大小都很重要。 (5)开始编译与应用运行脚本即可。最终会生成二进制库,比方iOS个别为动态库(.a文件),而Android个别为动静库(.so文件)。 ...

January 26, 2021 · 2 min · jiezi

关于编译:含有CGO代码的项目如何实现跨平台编译

目前小菜刀的我的项目中须要用到SQLite数据库,https://github.com/mattn/go-s...,采纳Go的标准接口有利于我的项目后续扩大,因而抉择了该驱动。然而,它是基于CGO实现的,所以跨平台编译会比拟麻烦,小菜刀总结了一些教训,特分享给读者敌人们。 什么是跨平台编译?简略地说, 就是在一个平台上生成另一个平台上的可执行代码。这里须要留神的是,所谓平台,实际上蕴含两个概念:体系架构(Architecture)、操作系统 (Operating System)。同一个体系架构能够运行不同的操作系统;同样,同一个操作系统也能够在不同的体系架构上运行。 咱们晓得Go语言是反对跨平台编译的,在之前的文章《Go穿插编译》中有具体介绍过怎么操作。Go实现跨平台编译的思维其实很简略:通过保留能够生成最终机器码的多份翻译代码,在编译时依据 GOARCH=xxx 和GOOS=xxx参数(对应体系架构和操作系统)进行初始化设置,最终调用对应平台编写的特定办法来生成机器码,从而实现跨平台编译。 CGO编译存在的问题有一点须要留神:Go所谓的跨平台编译只是针对Go代码局部,它是Go的穿插编译器(cross-compiler toolchains)。当咱们应用了CGO时,要想实现跨平台编译,同时须要让C/C++代码也反对跨平台。 package main/*#include <stdio.h>void printint(int v) { printf("printint: %d\n", v);}*/import "C"func main() { v := 42 C.printint(C.int(v))}小菜刀的开发机器:amd64架构,darwin零碎。指标编译平台:amd64架构,linux零碎。现想将上述含有CGO的代码编译为指标平台的可执行文件。 $ GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build -o main main.go通过以上命令,失去编译谬误如下 /usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1ld: warning: ignoring file /var/folders/xk/gn46n46d503dsztbc6_9qb2h0000gn/T/go-link-220081766/go.o, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x7F 0x45 0x4C 0x46 0x02 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 )Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executableld: symbol(s) not found for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)能够看到,因为CGO的存在,跨平台编译失败。那该如何解决呢? ...

January 11, 2021 · 3 min · jiezi