沃航科技网站开发,徐州网站建设费用,ie浏览器打不开建设银行网站,小说排行榜2020前十名python3实现版本PrefaceGNU Make 太麻烦#xff1f;Makefile 写起来太臃肿#xff1f;头文件依赖生成搞不定#xff1f;多核同时编译太麻烦#xff1f;Emake 帮你解决这些问题#xff1a;使用简单#xff1a;设定源文件#xff0c;设定编译参数和输出目标就行了#xf…python3实现版本PrefaceGNU Make 太麻烦Makefile 写起来太臃肿头文件依赖生成搞不定多核同时编译太麻烦Emake 帮你解决这些问题使用简单设定源文件设定编译参数和输出目标就行了emake为你打点好一切。依赖分析快速分析源代码所依赖的头文件决定是否需要重新编译。输出模式可执行、静态库(.a)、动态库(.so/.dll)。多核编译轻松实现并行编译加速项目构建。精简紧凑只有唯一的一个 emake.py 文件。交叉编译构建 iOS 项目 安卓项目等等。语言支持 C / C / ObjC / ObjC / ASM工具支持 gcc / mingw / clang运行系统 Windows / Linux / Mac OS X / FreeBSD方便的交叉编译轻松构建 Android NDK / iOS / asm.js 项目你见过最简单的构建系统比 Gnu Make / CMake 都简单很多只有两三个源代码那 makefile 随便写文件一多搞依赖都可以搞死人。emake 就是简单中的简单不但比 GNU Make 简单还要比 cmake 简单很多。Emake 是为快速开发而生的最初版本在 2009年发布多年间团队在不同操作系统下用它构建过服务端项目、客户端项目、iOS项目、安卓项目 和 Flash项目这些项目都稳健的跑在生产环境中为海量用户提供服务。多年的开发中emake 提高了各种大小项目的开发效率自身也随着时间增加不断被完善和稳定。InstallLinux / Mac OS X:wget http://skywind3000.github.io/emake/emake.pysudo python2 emake.py -i运行上面两条指令十秒内完成安装。emake 会拷贝自己到 /usr/local/bin 下面后面直接使用 emake 指令操作。Windows:下载 emake.py放到你的 mingw 根目录下(便于 emake 定位 gcc)并且添加到 PATH 环境变量同级目录新建立一个 emake.cmd 文件内容如下echo offd:\dev\python27\python.exe d:\dev\mingw\emake.py %*修改一下对应路径即可建立这个 emake.cmd 的批处理文件是为了方便每次敲 emake 就可以工作避免敲 python emake.py 一长串。Tutorial假设你有三个文件foo.c, bar.c, main.c 共同编译成名字为 main(.exe) 的可执行文件我们创建 “main.mak” 文件; 指明目标格式exe, lib, dll 三选一mode: exe; 加入源文件src: foo.csrc: bar.csrc: main.c是不是比 makefile, cmake 之类的步骤简单多了编译项目emake main.mak好了工程顺利编译成功每次任何一个文件发生变动相关对其依赖的源文件都会重新编译而无依赖的代码则不需要再次编译。增加编译选项如果需要增加编译选项的话; 指明目标格式exe, lib, dll 三选一mode: exe; 编译选项flag: -Wall, -O3, -g; 加入源文件src: foo.csrc: bar.csrc: main.c如果项目中使用了数学库 libm.a的话link: m如果还是用了 libstdc.a 的话link: m, stdc或者link: mlink: stdclink 可以直接写 .a 库的文件名link: ./lib/libmylib.a如果需要添加额外的 include 目录 和 lib 目录的话inc: /usr/local/opt/jdk/includelib: /usr/local/opt/jdk/lib还可以手动指定输出的文件名out: main手动指定临时文件夹避免临时 .o 文件污染当前目录的话int: objs这样所有的临时文件就会跑到 objs 目录下面了想要清理的话删除 objs目录即可。完整例子; 指明目标格式exe, lib, dll 三选一mode: exe; 编译选项flag: -Wall, -O3, -g; 设定链接link: m, pthread, stdc; 额外头文件路径inc: /usr/local/opt/jdk/includeinc: /usr/local/opt/jdk/include/linux; 额外库文件路径lib: /usr/local/opt/jdk/lib; 加入源文件src: foo.csrc: bar.csrc: main.cDocumentemake 的工程文件里面支持下面几种设置src用于声明项目里面的源文件格式src: file1src: file2...src: filen或者src: file1, file2, file3src: file4, file5, file6inc声明项目中的 include 文件夹相当于 gcc 的 -I 命令inc: dir1inc: dir2或者inc: dir1, dir2和 src 一样可以使用逗号分隔。lib设置库文件目录格式同上link添加需要链接的库相当于 gcc 的 -l 指令link: m, pthread, stdc或者link: mlink: pthreadlink: stdc同时支持单行和多行模式编译 C 项目别忘记链接 stdc。mode目标文件的输出格式mode: [exe|lib|dll|win]exe: 生成可执行文件lib: 生成静态链接库dll: 生成动态链接库win: windows下特有生成无 console窗口的 windows程序。out指定目标文件的文件名out: target_file_nameint指定中间临时文件目录一般设置为int: objs或者int: objs/$(target)flag指定编译参数会被直接传递给 gcc.flag: -Wall, -g, -pg诸如此类SettingsEmake 可以指定一个 ini 文件来进行配置原来是emake 手动指定配置文件名emake --inixxx.ini 如果不指明的话会首先在当前文件夹寻找 emake.ini 文件同时 Linux 下面的话还会相继在下面三个位置/etc/emake.ini/usr/local/etc/emake.ini~/.config/emake.ini进行寻找。该配置文件确定了一些编译的默认配置在该配置文件中可以更改默认编译器的可执行文件名更改默认连接器的可执行文件名设定编译条件设定默认编译的参数include / lib 等文件夹等设定编译器启动的一些环境变量设定多核编译时的 cpu 数量。预先设定一些 section工程文件可以 import 特定的 section。由上面这些设定emake 可以灵活的调用各种工具链方便的进行项目构建和交叉编译。比如我在 Windows 下面的 emake.ini 部分内容[default]flag-Wall, -I$(inihome)/../mylibslinkstdc, winmm, wsock32, opengl32, gdi32, glu32, ws2_32, user32included:/dev/local/includelibd:/dev/local/libcpu6[ffmpeg]included:/dev/local/opt/ffmpeg/includelibd:/dev/local/opt/ffmpeg/liblinkavcodec, avdevice, avfilter, avformat, avutil, postproc, swscale[qt]includeD:/Dev/Qt/sdk/4.8.3-mingw/include;D:/Dev/Qt/sdk/4.8.3-mingw/include/QtGuilibD:/Dev/Qt/sdk/4.8.3-mingw/liblinkstdc, ole32, gdi32, wsock32, opengl32, gdi32, glu32, ws2_32, uuid, oleaut32, winmm, imm32, winspool, QtCore4, QtGui4, QtGuid4[qt45]includeD:/Dev/Qt/4.5.0-mingw-static/include;D:/Dev/Qt/4.5.0-mingw-static/include/QtGuilibD:/Dev/Qt/4.5.0-mingw-static/liblinkstdc, ole32, gdi32, wsock32, opengl32, gdi32, glu32, ws2_32, uuid, oleaut32, winmm, imm32, winspool, QtCore, QtGui默认区(default)作用于每一个工程文件其中 cpu字段只能出现在默认区它规定了编译时最多使用多少个核进行编译其他区的话需要在工程里使用 import 来导入import: qt, ffmpeg那么在你的工程里上面 qt 和 ffmpeg 的相关配置就会被导入了。Cross Compilation交叉编译的话需要单独一个 ini文件来规定工具链比如我的 android交叉编译配置[default]flag-Wallhomebingccarm-linux-androideabi-gccararm-linux-androideabi-arasarm-linux-androideabi-asnameandroid,posix,armcpu4其中 home 规定了 ndk工具链 gcc环境所在的可执行路径后面同时定义了gcc, ar, as 三个必须的可执行文件名使用的时候emake --inid://android-toolchain/android-9/emake.ini xxx在 default 区中定义了很多 name 这些 name 可以用来做工程文件的条件判断比如android/flag: -mfloat-abisoftfpposix/link: pthreadwin32/link: winmm, wsock32, ws2_32不同的 ini 文件中定义的 name 不同在工程文件中会判断是否定义过某个 name 定义过的话执行后面的话如此在同一个工程文件中可以针对不同平台定义源文件设置编译参数。Rapid Development不管时 GNU Make 还是 cmake亦或时其他构建系统都需要你写一个专门的工程文件来描述该工程。对于大项目很正常但是对于中小项目特别时一些测试类项目这真的太麻烦了。Emake 可以不用工程文件而将工程配置信息嵌入到源代码的注释中#include #include #include foobar.h//! mode: exe//! src: foo.cpp, bar.cpp, utils.cppint main(void){printf(Hello, World !!\n);foo();bar();return 0;}这样在你的源文件里面增添两行以后即可使用emake main.cpp来进行编译emake 会自动提取 //! 开头的注释解析为 emake的项目描述信息上面的配置描述了该项目依赖的文件(除了 main.cpp自己外)以及项目模式为生成可执行文件。这样写起来比所有构建系统都简单很多。Credits本项目旧地址