comake使用详解

合集下载

automake的教程

automake的教程

转一个automake的教程2008年06月24日星期二下午 03:03使用 GNU autotools 改造一个软件项目本文不是一篇规范的教程,而是用一个软件项目作为例子,演示使用 GNU autotools 进行软件管理的思路和过程目录· 示例项目· 软件布局· Makefile 分析· GNU 的软件风格· 准备 autotools· 改造文件布局· autoscan· configure.ac 的基本结构· Makefile 文件的产生· 编写 Makefile.am软件根目录 Makefile.amsrc/Makefile.amdata/Makefile.amdocs/Makefile.amfonts/Makefile.amimages/Makefile.ammusic/Makefile.amsound/Makefile.am· 运行 autotools· SDL 库的侦测· 软件使用的数据文件· configure 选项· autotools 脚本· 使用 configure 产生的 Makefile· 最终的 configure.ac 文件· 结束语示例项目这里借用了 Wei Mingzhi <whistler_wmz@> 开发的麻将游戏来进行演示,在此,先对他表示感谢!示例软件下载:软件布局将下载的软件包解压到一个目录$ cd ~/work$ tar xjf mahjong.tar.bz2可以看到这是一个典型的 Windows 风格的软件项目布局,在 mahjong 目录下放着程序的源码,程序运行时使用的数据文件放在子目录下面作者还提供了一个 Makefile,一个 DOS 风格的 !play.bat 批处理文件,一个编译好的mj.exe 可执行文件在 Win32 平台上运行 !play.bat 就可以直接运行程序在Unix/Linux 系统上,进入 mahjong 目录,键入 make 命令,如果一切顺利的话,将生成 mj 可执行文件,然后在命令行上运行 ./mj 程序,也可以启动麻将游戏对于一个 Windows 程序来讲,该软件布局可以说非常清晰明了但在 Unix/Linux 系统上,执行 make 命令就可能遇到问题:编译找不到头文件,或者连接找不到库文件而在make 成功以后,运行麻将程序必须先进入该 majiong 目录,才能执行程序如果要像其他的程序一样,可以在任意目录使用,就要专门为这一个程序修改 PATH 环境变量,或者再写一个启动脚本,并将它复制到 /usr/bin 这样的目录下Makefile 分析1 #2 # Copyright (c) 2005, Wei Mingzhi. All rights reserved.3 #4 # Use, redistributions and modifications of this file is5 # unrestricted provided the above copyright notice is6 # preserved.7 #89 OBJ = \10 bot.o config.o game.o general.o hand.o ini.o main.o \11 player.o text.o tile.o util.o1213 HEADERS = \14 bot.h game.h general.h hand.h ini.h main.h player.h \15 tile.h1617 CC = gcc18 CXX = g++1920 TARGET = mj2122 BASEFLAGS = -g3 -D_DEBUG=123 #BASEFLAGS = -s -O32425 CFLAGS = ${BASEFLAGS} `sdl-config --cflags`26 LDFLAGS = ${BASEFLAGS} `sdl-config --libs` -lSDL_image -lSDL_mixer -lSDL_ttf2728 all: ${TARGET}2930 ${TARGET}: ${OBJ}31 ${CXX} ${LDFLAGS} -o ${TARGET} ${OBJ}3233 clean:34 rm -f *.o ${TARGET}3536 distclean:37 rm -f *.o ${TARGET}3839 %.o: %.cpp ${HEADERS}40 ${CXX} ${CFLAGS} -c $< -o $@4142 %.o: %.c ${HEADERS}43 ${CC} ${CFLAGS} -c $< -o $@Makefile 很清楚:第 20 行定义 TARGET 变量为 mj,第 28 行表明 make 默认的 target也就是生成 `mj';第 22 行加入编译时的调试信息;第 2526 行使用了sdl-config 工具侦测 SDL 开发库编译链接信息,在 26 行还指明需要连接SDL_imageSDL_mixser 和SDL_ttf 库GNU 的软件风格一个标准的 GNU 软件,编译安装都是使用下面三个步骤:$ ./configure$ make$ make installconfigure 脚本运行时可以侦测系统的环境,确定软件安装目录,然后生成Makefile 文件make 调用系统中的编译器进行编译和连接make install 将软件安装到设定的目录用户执行 configure 时可以通过它的命令行参数指定自己所需的编译选项,比如安装目录通过 --prefix=PREFIX 设置,如果不指定,缺省情况下 PREFIX 是 /usr/local 默认安装时,执行文件安装到 /usr/local/bin 目录,库安装到 /usr/local/lib 目录,数据文件安装到 /usr/local/share 目录由于 GNU 的软件风格方便易用,通用性好,可移植性高,现在大多数 Unix/Linux 系统上的自由软件都采用这种方式分发软件准备 autotoolsGNU autotools 主要包含三个软件: autoconf,automake 和 libtool当前流行的有新旧两个版本,本例采用的是新版本,分别对应的是: autoconf 2.59, automake 1.9.6和 libtool 1.5.18很多 linux 发行版都会默认安装这几个工具本例是在 NetBSD 下进行操作,安装这几个软件包是通过 pkgsrc,它们在 pkgsrc 目录为 devel/autoconfdevel/automake 和devel/libtool改造文件布局原来软件的根目录下面放的是程序的源码,按照 GNU 的习惯,将它们放到 src 子目录,根目录留给 configure 这类文件使用,其他的数据文件保持不变,仍然放在各自的子目录先创建一个目录 majiang,然后根据需要将 mahjong 目录下的文件复制过来由于是为Unix/Linux 系统进行改写,原目录里的 win32 相关文件就不用复制到新目录$ cd ~/work/majiang$ lsdata/ docs/ fonts/ images/ music/ sound/ src/autoscanautoconf 软件包里面的 autoscan 工具可以扫描工作目录,生成一个configure.ac 的模板文件 configure.scan$ cd ~/work/majiang$ autoscanautoscan 命令在当前目录生成的 configure.scan 文件内容为:1 # -*- Autoconf -*-2 # Process this file with autoconf to produce a configure script. 34 AC_PREREQ(2.59)5 AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)6 AC_CONFIG_SRCDIR([src/bot.h])7 AC_CONFIG_HEADER([config.h])89 # Checks for programs.10 AC_PROG_CXX11 AC_PROG_CC1213 # Checks for libraries.1415 # Checks for header files.16 AC_HEADER_STDC17 AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])1819 # Checks for typedefs, structures, and compiler characteristics.20 AC_HEADER_STDBOOL21 AC_C_CONST22 AC_C_INLINE2324 # Checks for library functions.25 AC_FUNC_MALLOC26 AC_FUNC_REALLOC27 AC_CHECK_FUNCS([memset strcasecmp strchr strdup])28 AC_OUTPUT# 号开始的行是注释,其他都是 m4 宏命令将它改名为 configure.ac,然后在此基础上进行修改configure.ac 的基本结构configure.ac 文件是 autoconf 的输入文件,经过 autoconf 处理,展开里面的 m4 宏,输出的是 configure 脚本第 4 行声明本文件要求的 autoconf 版本,因为本例使用了新版本 2.59,所以在此注明第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息,本例写成:AC_INIT(majiang, 1.0)这里省略了 BUG-REPORT-ADDRESS 参数,它是可选项,一般写成作者的邮件地址第 6 行 AC_CONFIG_SRCDIR 宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性可以选择源码目录中的任何一个文件作为代表,比如将 autoscan 选择的bot.h文件改成 main.cpp:AC_CONFIG_SRCDIR([src/main.cpp])宏参数中使用 `[ ]',是为了表明其中的字符串是一个整体第 7 行的 AC_CONFIG_HEADER 宏用于生成 config.h 文件,里面存放configure 脚本侦测到的信息如果程序需要使用其中的定义,就在源码中加入#include <config.h>其他的一些宏是标准的侦测过程,可以保留不动configure.ac 文件要求 AC_INIT 宏必须放在开头位置,AC_OUTPUT 放在文件末,中间用来检测编译环境的各种宏没有特别的先后次序要求,由宏之间相互关系决定Makefile 文件的产生前面 configure.ac 里面的宏,主要作用是侦测系统,并没有编译相关的设置因为这些信息是写在 Makefile.am 里面,然后用 automake 工具转换成 Makefile.in,configure脚本执行时再读取 Makefile.in,并与侦测信息一起写到 Makefile 文件在 autotools 的命名习惯中,后缀 ac 的文件是 autoconf 的输入文件,后缀am 的文件是 automake 的输入文件,后缀 in 的文件是 configure 的输入文件autoconf 旧版本中 configure.in 等同于 configure.ac,虽然新版本也可以识别,但它不符合命名规则,所以新版本的文件应该使用 ac 后缀简单的 Makefile.in 可以手动编写,如果使用 automake 产生,需要在configure.ac里面加入 AM_INIT_AUTOMAKE 宏进行声明要输出 Makefile,还需要在 configure.ac 中使用 AC_CONFIG_FILES 宏指明该宏并不是只处理 Makefile,而是将 FILE.in 文件转换为 FILE 文件因为 make 可以遍历子目录,如果子目录中存在 Makefile,也将同时处理在本例中 src 目录下是源码,其他是数据文件,可以使用单独一个 Makefile 放在根目录下面,也可以用多个Makefile由于每个子目录的 Makefile 只处理本目录的文件,分工明确,是模块化的方法,推荐使用因此在 configure.ac 里面增加下面的宏,表示软件根目录和子目录中都需要生成Makefile 文件:AC_CONFIG_FILES([Makefilesrc/Makefiledata/Makefiledocs/Makefilefonts/Makefileimages/Makefilemusic/Makefilesound/Makefile])编写 Makefile.am软件根目录 Makefile.am由于该目录下面保存的是与 autotools 相关的文件,没有需要编译安装的文件,所以只注明需要进一步处理的子目录信息:SUBDIRS = src data docs fonts images music soundsrc/Makefile.am此目录里是源代码,最终生成 mj 可执行文件,在其 Makefile.am 中写入bin_PROGRAMS = mjmj_SOURCES = bot.h \bot.cpp \config.cpp \game.h \game.cpp \general.h \general.cpp \hand.h \hand.cpp \ini.h \ini.cpp \main.h \main.cpp \player.h \player.cpp \text.cpp \tile.h \tile.cpp \util.cppam 文件里变量通过命名判断其含义,保留的字符串间用下划线分隔bin_PROGRAMS 表示列出二进制的程序,值为多个空格分开的程序列表,这里仅有一个 mjmj_SOURCES 列出的是组成 mj 程序的文件,文件比较多的时候,每个文件写成一行容易看清楚data/Makefile.am本目录的文件是 mj 运行时读取的数据,它的 Makefile.am 可以这样写mjdatadir = $(pkgdatadir)/datamjdata_DATA = mj.ini titles.txtEXTRA_DIST = $(mjdata_DATA)因为 datadir 是保留的关键字,所以用 mjdatadir 代替,pkgdatadir 指向$prefix/share/FULL-PACKAGE-NAME 目录,因为在 AC_INIT 中已经声明FULL-PACKAGE-NAME 为majiang,pkgdatadir 就等于 $prefix/share/majiang 目录其中 mjdatadir 让 data 目录下的文件安装到 $prefix/share/majiang/data 目录里面mjdata_DATA 列出此目录下需要安装的文件,然后用 EXTRA_DIST 变量注明余下几个子目录都与 data 目录类似docs/Makefile.amdocsdir = $(pkgdatadir)/docsdocs_DATA = gkai00mp.txt gpl.html readme.txtEXTRA_DIST = $(docs_DATA)fonts/Makefile.amfontsdir = $(pkgdatadir)/fontsfonts_DATA = brush.ttf gkai00mp.ttfEXTRA_DIST = $(fonts_DATA)images/Makefile.amimagesdir = $(pkgdatadir)/imagesimages_DATA = bgame.jpg \mjgirl1a.jpg \mjgirl2a.jpg \mjgirl3a.jpg \mjgirl4a.jpg \tiles.jpg \electron.jpg \mjgirl1b.jpg \mjgirl2b.jpg \mjgirl3b.jpg \mjgirl4b.jpg \gameover.jpg \mjgirl1c.jpg \mjgirl2c.jpg \mjgirl3c.jpg \mjgirl4c.jpgEXTRA_DIST = $(images_DATA) music/Makefile.ammusicdir = $(pkgdatadir)/music music_DATA = bet.ogg \ bonus.ogg \music.ogg \musicb.ogg \musice.ogg \win.ogg \bgame.ogg \gameover.ogg \music1.ogg \musicc.ogg \musicp.oggEXTRA_DIST = $(music_DATA) sound/Makefile.amsounddir = $(pkgdatadir)/sound sound_DATA = boom.wav \ding.wav \discard.wav \discard2.wav \flash.wav \snd1.wav \snd2.wav \snd3.wav \EXTRA_DIST = $(sound_DATA)运行 autotools准备好 configure.ac 和 Makefile.am,就可以用 autotools 的命令处理这些文件开始可能会出现错误,不过没关系,可以按照错误信息的提示逐步进行修正首先要使用的是 aclocal 命令,它根据 configure.ac 的定义,将需要使用的m4 宏定义复制到 aclocal.m4 里面缺省时,搜索 m4 宏是从 autoconf 的安装目录和系统的aclocal 目录如果需要使用其他路径下的宏,可以通过命令行的 -I 选项指定接着使用 autoheader 命令,它负责生成 config.h.in 文件,这里面的 C 语言宏定义也是通过解析 configure.ac 产生下来运行 automake 命令处理 Makefile.am,生成 Makefile.inGNU 对自己发布的软件有严格的规范,比如必须附带许可证声明文件 COPYING 等等,否则 automake 执行时会报错automake 提供了三种软件等级: foreigngnu 和 gnits,让用户选择采用,默认等级为 gnu本例使用 foreign 等级,它只检测必须的文件有一些必需的脚本文件可以从 automake 软件包里复制过来,在执行时使用 --add-missing 选项可以让automake 自动添加,默认方式是采用符号链接,如加上 --copy 选项则可以使用复制方式本例中,automake 的命令如下:$ automake --foreign --add-missing --copy最后,使用 autoconf 命令生成 configure 脚本文件SDL 库的侦测这个麻将游戏是基于 SDL 库开发的,一般系统默认不会安装,因此 configure 脚本的一个任务就是检查用户的系统中是否有该软件包autoconf 提供了很多宏可以实现侦测功能,但首先应该查看 SDL 软件包是否已应的宏通过 pkgsrc 的工具可以看到:$ pkg_info -L SDL|grep m4/usr/pkg/share/aclocal/sdl.m4即 SDL 软件包提供了一个 sdl.m4 宏,放在系统的 aclocal 目录下在这个宏文件的注释中说明了使用的方法:dnlAM_PATH_SDL([MINIMUM-VERSION,[ACTION-IF-FOUND[,ACTION-IF-NOT-FOUND]]] )dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS也就是说在 configure.ac 里面调用 AM_PATH_SDL 宏,就可以侦测 SDL找到SDL 库以后,该宏还输出 SDL_CFLAGS 和 SDL_LIBS 编译连接选项,它们实际上就是调用`sdl-config --cflags` 和 `sdl-config --libs`于是在 configure.ac 里面加入 AM_PATH_SDL 宏# Checks for libraries.SDL_VERSION=1.2.0AM_PATH_SDL($SDL_VERSION,:,AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]))当前 SDL 的版本为 1.2.9,于是 MINIMUM-VERSION 就设为 1.2.0如果在系统中侦测到需要的库,没什么额外的操作,假如没有找到,则给出错误信息AM_PATH_SDL 输出 SDL_CFLAGS 和 SDL_LIBS 编译参数,需要添加到src/Makefile.am 里面:mj_CPPFLAGS = @SDL_CFLAGS@mj_LDFLAGS = @SDL_LIBS@用 `@' 包围的变量会在 configure 执行时被替换从 mahjong 的 Makefile 中看到,这个软件还要使用 SDL_imageSDL_mixser 和SDL_ttf 库,但它们不属于 SDL 软件包,需要另外安装由于这些库在 sdl.m4 中也没有进行侦测,所以自己要写一些脚本autotools 提供了一个 AC_CHECK_LIB 宏可以用来检测库,现在就使用它来检测这几个SDL 库该宏的语法为:AC_CHECK_LIB (LIBRARY, FUNCTION, [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], [OTHER-LIBRARIES])第一个参数是库名,第二个参数是库中的一个函数,第三个参数是检测到以后进行的动作,第四个参数是未检测到以后的动作,第五个参数是其他的库对于 SDL_imageSDL_mixer 和 SDL_ttf 对应的使用方法如下:# Check for SDL_image libraryAC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([*** Unable to find SDL_image libary with PNG support(/projects/SDL_image/)]), `sdl-config --libs`)# Check for SDL_mixer libraryAC_CHECK_LIB(SDL_mixer, Mix_LoadOGG_RW, , AC_MSG_ERROR([*** Unable to find SDL_mixer libary with OGG support(/projects/SDL_mixer/)]), `sdl-config --libs`)# Check for SDL_ttf libraryAC_CHECK_LIB(SDL_ttf, TTF_OpenFont, , AC_MSG_ERROR([*** Unable to find SDL_ttf libary(/projects/SDL_ttf/)]), `sdl-config --libs`)软件使用的数据文件原来 mj 读取数据是从执行时目录的子目录中读取,但现在将数据放到$prefix/share/majiang 目录下,需要通过一种途径让程序可以知道数据文件被安放的位置要达到这个目的有很多方法,这里采用最直接的一种:将数据文件安装目录变量通过CPPFLAGS 编译参数传递给程序于是修改 src/Makefile.am 的 CPPFLAGS:mj_CPPFLAGS = @SDL_CFLAGS@ -DDATA_DIR=\"${datadir}/majiang\"相应地修改 src 目录下的源码,在读取数据文件的地方,将读取的路径改成DATA_DIR里对应的子目录例如,原先 config.cpp 中是:void LoadCfg(){cfg.Load("data/mj.ini");}现改成:void LoadCfg(){char ini_file[260];sprintf(ini_file, "%s/data/mj.ini", DATA_DIR);cfg.Load(ini_file);}configure 选项原来 mahjong 的 Makefile 第 22 行定义了 debug 调试选项,虽然也可以照样放到 src/Makefile.am 的 CPPFLAGS 里面实现,但 autotools 提供了一种更灵活的机制configure 脚本可以通过选项来设置编译参数,现增加一个 --enable-debug 选项,需要DEBUG 时,在命令行上加上它来打开,默认则关闭这项功能是使用 AC_ARG_ENABLE 宏实现:AC_ARG_ENABLE (FEATURE, HELP-STRING, [ACTION-IF-GIVEN],[ACTION-IF-NOT-GIVEN])其中 FEATURE 是名称,HELP_STRING 为说明信息,在使用 ./configure --help 时可以看到最后两个分别对应打开和关闭时的操作现在将 DEBUG 功能加入 configure.ac:AC_ARG_ENABLE(debug,[ --enable-debug turn on debug],CXXFLAGS="$CXXFLAGS -g3 -D_DEBUG=1")autotools 脚本每次修改了 configure.ac 或 Makefile.am 等 autotools 输入文件后都需要再次运行aclocalautomakeautoconf 这些命令,为了方便起见,可以将他们放到一个shell脚本里面,例如:#! /bin/shset -xaclocalautoheaderautomake --foreign --add-missing --copyautoconf将上面内容保存到 autogen.sh 文件,并修改文件属性为 755每次需要重新生成configure 脚本时,执行 ./autogen.sh 即可使用 configure 产生的 Makefile现在执行 ./autogen.sh 得到的 configure 脚本已经可以正常工作了,进入~/work/majiang 目录,执行 ./configure,可以看到它检查系统的过程,包括 SDL 和SDL_image 等库的侦测结果使用 ./configure --help 可以看到 autotools 提供的帮助信息configure 执行的完毕,输出软件根目录和几个子目录下面的 Makefile 文件这些Makefile 有几个常用的 target:· make all不加任何 target,默认就是 all,作用是编译软件· make install安装软件包,如果安装到系统目录,需要 root 权限· make clean清除编译产生的目标文件· make distclean可以同时清除编译的结果和 configure 输出的文件· make tags生成 etags 使用的 TAGS 文件· make dist生成软件发布包,为 tar.gz 格式的压缩包,文件名由软件包名和版本组成最终的 configure.ac 文件# -*- Autoconf -*-# Process this file with autoconf to produce a configure script.AC_PREREQ(2.59)AC_INIT([majiang], [1.0])AC_CONFIG_SRCDIR([src/main.cpp])AC_CONFIG_HEADER([config.h])AC_CANONICAL_HOSTAC_CANONICAL_TARGETAM_INIT_AUTOMAKE# Checks for programs.AC_PROG_CXXAC_PROG_CCAC_LANG(C++)# Checks for libraries.SDL_VERSION=1.2.0AM_PATH_SDL($SDL_VERSION,:,AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]))# Check for SDL_image libraryAC_CHECK_LIB(SDL_image, IMG_LoadPNG_RW, , AC_MSG_ERROR([*** Unable to find SDL_image libary with PNG support(/projects/SDL_image/)]), `sdl-config --libs`)# Check for SDL_mixer libraryAC_CHECK_LIB(SDL_mixer, Mix_LoadOGG_RW, , AC_MSG_ERROR([*** Unable to find SDL_mixer libary with OGG support(/projects/SDL_mixer/)]), `sdl-config --libs`)# Check for SDL_ttf libraryAC_CHECK_LIB(SDL_ttf, TTF_OpenFont, , AC_MSG_ERROR([*** Unable to find SDL_ttf libary(/projects/SDL_ttf/)]), `sdl-config --libs`)# Checks for header files.AC_HEADER_STDCAC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])# Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOLAC_C_CONSTAC_C_INLINE# Checks for library functions.AC_FUNC_MALLOCAC_FUNC_REALLOCAC_CHECK_FUNCS([memset strcasecmp strchr strdup])AC_ARG_ENABLE(debug,[ --enable-debug turn on debug],CXXFLAGS="$CXXFLAGS -g3 -D_DEBUG=1")AC_CONFIG_FILES([Makefilesrc/Makefiledata/Makefiledocs/Makefilefonts/Makefileimages/Makefilemusic/Makefilesound/Makefile])AC_OUTPUT结束语GNU 的很多工具经常给人一种感觉: 功能很强大,但也很难学autotools 可以说是这类工具的一个典型,它需要用户对 shellmake软件编译m4 宏语言,以及Unix/Linux操作系统各方面知识都有一定的了解使用时又要 autoconf automakelibtool 多个工具相互配合^1,如果要给软件增加国际化功能,还要再了解和掌握 gettextpo 等工具和规则与学习其他知识一样,所谓难,其实是不了解,不熟悉本文通过一个范例演示使用autotools 的过程,是让不了解的人熟悉这个工具但真正的理解,还需要将它运用到自己的软件项目当中,不断地实践,不断地思考和总结脚注... 多个工具相互配合^1由于本例软件中没有生成库文件,所以没有涉及 libtool 工具的使用。

CMake用法导览

CMake用法导览

CMake⽤法导览本⽂下述内容是⼀个⼿把⼿的使⽤指南;它涵盖了CMake需要解决的公共构建系统的⼀些问题。

这些主题中的许多主题已经在Mastering CMake⼀书中以单独的章节被介绍过,但是通过⼀个样例⼯程看⼀看它们如何⼯作也是⾮常有帮助的。

本指南可以在CMake源码树的Tests/Tutorial路径下找到。

每⼀步都有它⾃⼰的⼦路径,其中包含该步骤的⼀个完整的指南。

作为基础的起始点(步骤1) 最基本的⼯程是⼀个从源代码⽂件中构建可执⾏⽂件的例⼦。

对于简单⼯程,只要⼀个两⾏的CMakeLists⽂件就⾜够了。

这将会作为我们指南的起点。

这份CMakeLists⽂件看起来像是这样:cmake_minimum_required (VERSION 2.6)project (Tutorial)add_executable(Tutorial tutorial.cxx) 注意到这个例⼦在CMakeLists⽂件中使⽤了⼩写。

CMake⽀持⼤写、⼩写、混合⼤⼩写的命令。

tutorial.cxx中的源代码⽤来计算⼀个数的平⽅根,并且它的第⼀版⾮常简单,如下所⽰:// A simple program that computes the square root of a number// 计算⼀个数的平⽅根的简单程序#include <stdio.h>#include <stdlib.h>#include <math.h>int main (int argc, char *argv[]){if (argc < 2){fprintf(stdout,"Usage: %s number\n",argv[0]);return 1;}double inputValue = atof(argv[1]);double outputValue = sqrt(inputValue);fprintf(stdout,"The square root of %g is %g\n",inputValue, outputValue);return 0;}我们添加的第⼀个特性⽤来为⼯程和可执⾏⽂件指定⼀个版本号。

超详细的cmake入门教程

超详细的cmake入门教程

超详细的cmake⼊门教程什么是cmake你或许听过好⼏种 Make ⼯具,例如 GNU Make ,QT 的 qmake ,微软的 MSnmake,BSD Make(pmake),Makepp,等等。

这些 Make ⼯具遵循着不同的规范和标准,所执⾏的 Makefile 格式也千差万别。

这样就带来了⼀个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。

⽽如果使⽤上⾯的 Make ⼯具,就得为每⼀种标准写⼀次 Makefile ,这将是⼀件让⼈抓狂的⼯作。

CMake CMake附图 1 CMake就是针对上⾯问题所设计的⼯具:它⾸先允许开发者编写⼀种平台⽆关的 CMakeList.txt ⽂件来定制整个编译流程,然后再根据⽬标⽤户的平台进⼀步⽣成所需的本地化 Makefile 和⼯程⽂件,如 Unix 的 Makefile 或Windows 的 Visual Studio ⼯程。

从⽽做到“Write once, run everywhere”。

显然,CMake 是⼀个⽐上述⼏种 make 更⾼级的编译配置⼯具。

⼀些使⽤ CMake 作为项⽬架构系统的知名开源项⽬有 VTK、ITK、KDE、OpenCV、OSG 等。

在 linux 平台下使⽤ CMake ⽣成 Makefile 并编译的流程如下:1. 编写 CMake 配置⽂件 CMakeLists.txt 。

2. 执⾏命令 cmake PATH 或者 ccmake PATH ⽣成 Makefile。

其中, PATH 是 CMakeLists.txt 所在的⽬录。

(ccmake 和cmake 的区别在于前者提供了⼀个交互式的界⾯)3. 使⽤ make 命令进⾏编译。

⼊门案例:单个源⽂件本节对应的源代码所在⽬录:Demo1。

对于简单的项⽬,只需要写⼏⾏代码就可以了。

例如,假设现在我们的项⽬中只有⼀个源⽂件 ,该程序的⽤途是计算⼀个数的指数幂。

camke的使用方法

camke的使用方法

CMake的使用方法什么是CMake?CMake是一个跨平台的开源构建系统,用于管理C++项目的编译过程。

它可以生成与平台无关的构建脚本,使开发者可以轻松地在不同的操作系统和编译器上构建他们的代码。

CMake使用一种名为CMakeLists.txt的简单文本文件来描述项目的构建过程。

通过定义目标、源文件、依赖关系和编译选项等信息,CMake可以自动生成适用于各种构建工具(如make、ninja等)的构建脚本。

安装CMake在开始使用CMake之前,首先需要安装它。

你可以从[CMake官方网站](下载适合你操作系统的安装包,并按照指示进行安装。

编写CMakeLists.txt创建一个新目录作为你的项目根目录,并在该目录下创建一个名为CMakeLists.txt的文件。

这个文件将包含所有关于项目构建过程的信息。

基本语法一个基本的CMakeLists.txt文件由一系列命令组成,每个命令占据一行,并以分号结尾。

下面是一个简单例子:cmake_minimum_required(VERSION 3.10) # 指定最低要求版本project(MyProject) # 设置项目名称add_executable(MyApp main.cpp) # 添加一个可执行文件添加源文件使用add_executable命令可以将源文件添加到你的项目中。

该命令的第一个参数是目标名称(可执行文件名),后面是源文件列表。

例如:add_executable(MyApp main.cpp utils.cpp)添加子目录如果你的项目包含多个子目录,可以使用add_subdirectory命令将它们添加到项目中。

这样,每个子目录都可以有自己的CMakeLists.txt文件来描述构建过程。

add_subdirectory(subdir)链接库如果你的项目依赖于外部库,可以使用target_link_libraries命令将它们链接到你的可执行文件中。

C语言make和Makefile介绍及使用

C语言make和Makefile介绍及使用

C语⾔make和Makefile介绍及使⽤1:make和Makefile的介绍:概念在软件的⼯程中的源⽂件是不计其数的,其按照类型,功能,模块分别放在若⼲个⽬录中,哪些⽂件需要编译,那些⽂件需要后编译,那些⽂件需要重新编译,甚⾄进⾏更复杂的功能操作,这就引⼊了我们的系统编译的⼯具:在linux和unix中,有⼀个强⼤的使⽤程序,叫make,可以⽤它来管理多模块程序的编译和链接,直⾄⽣成可执⾏⽂件make使⽤程序读取⼀个说明⽂件,称为Makefile,Makefile⽂件中描述了整个软件⼯程的编译规则和各个⽂件之间的依赖关系;Makefile就像是⼀个Shell脚本⼀样,其中可以执⾏操作系统的命令,它带来的好处就是我们能够实现“⾃动化编译”,⼀旦写好,只要⼀个make命令,整个软件功能就完全⾃动编译,极⼤的提⾼了软件开发的效率;make是⼀个命令⼯具,是⼀个解释Makefile中指令的命令⼯具,⼀般来说⼤多数IDE都有这个命令使⽤make可以是重新编译的次数达到最⼩化;2:make和Makefile1:make的使⽤语法:make使⽤语法:make [选项][⽬标][宏定义]选项列表:-d 显⽰调试信息(debug)-f<⽂件> 指定从那个⽂件中读取以来关系,默认⽂件是"Makefile"或者"makefile","-"表⽰从标准输⼊(file)-h 显⽰所有选项的简要说明(help)-n 不运⾏任何Makefile命令,只去现实它们(no)-s 安静的⽅式运⾏,不显⽰任何信息(silence)可以使⽤-h来获取更多的选项:2:Makefile的编写原则和规则当make命令不带选项运⾏的时候,它从Makefile中读取指定规则当制定规则不同与Makefile(makefile)的其他⽂件中时候,就要运⾏带有-f选项的make命令。

Make命令完全详解教程

Make命令完全详解教程

Make命令完全详解教程Make命令完全详解教程无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。

不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。

利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。

而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。

而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。

因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了。

一、Make程序的命令行选项和参数Make命令参数的典型序列如下所示:make [-f makefile文件名][选项][宏定义][目标]这里用[]括起来的表示是可选的。

命令行选项由破折号“–”指明,后面跟选项,如如果需要多个选项,可以只使用一个破折号,如也可以每个选项使用一个破折号,如Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:–k:如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。

我们可以利用这个选项来查出所有有编译问题的源文件。

–n:该选项使make程序进入非执行模式,也就是说将原来应该执行的命令输出,而不是执行。

–f :指定作为makefile的文件的名称。

如果不用该选项,那么make 程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。

如果您在Linux下使用GNU Make 的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。

Automake中文手册

Automake中文手册

automake中文手册收藏GNU AutomakeFor version 1.3, 3 April 1998 David MacKenzie and Tom Tromey目录·介绍·通用性概念o通用操作o深度o严格性o统一命名机制o派生变量是如何命名的·一些实例软件包o一个简单的例子,从起点到终点o一个经典的程序o创建etags和ctags·创建`Makefile.in'·扫描`configure.in'o配置需求oAutomake能够识别的其它事情o自动生成的aclocal.m4o由Automake支持的Autoconf宏 o编写你自己的aclocal宏·顶层`Makefile.am'·创建程序和库o创建一个程序o创建一个库o对LIBOBJS和ALLOCA的特别处理 o创建一个共享库o创建一个程序时使用的变量o对Yacc和Lex的支持oC++和其它语言o自动de-ANSI-ficationo自动的依赖性(dependency)跟踪·其它派生对象o可执行的脚本o头文件o与体系结构无关(Architecture-independent)的数据文件o已创建的源代码·其它GNU工具oEmacs LispoGettextoGuileoLibtooloJava·创建文档oTexinfooMan手册·安装了些什么·清除了些什么·需要发布哪些文件·对测试套件(test suites)的支持·改变Automake的行为·其它规则o与etags之间的界面o处理新的文件扩展名·条件(Conditionals)·--gnuand --gnits的效果·--cygnus的效果·什么时候Automake不够用·发布`Makefile.in'·未来的某些想法·索引@dircategory GNU admin @direntry * automake: (automake). Making Makefile.in's @dircategory Individual utilities @direntry * aclocal: (automake)Invoking aclocal. Generating aclocal.m4Copyright (C) 1995, 96 Free Software Foundation, Inc.这是GNU Automake文档的第一版,并且是针对GNU Automake 1.3的。

automake详解

automake详解
2.6.1Autoconf/Automake工具组简介(1)
Autoconf/Automake工具组主要包括autoconf、automake、perl语言环境和m4。其中FC4默认安装的autoconf和automake软件包信息如下:
[root@localhost hello]# rpm -qa |grep autoconf //查看是否安装autoconf
使用Autoconf/Automake工具自动生成Makefile文件的流程图如图2-5所示。在此过程中使用的命令主要有aclocal、autoscan、autoconf、autoheader和automake。由图可知运行步骤如下:
(点击查看大图)图2-5自动创建Makefile文件流程
(1)创建源代码文件,使用"autoscan"生成configure.scan文件,将其重命名为configure.ac,并做适当修改,然后使用"aclocal"命令生成aclocal.m4文件,使用"autoconf"命令由configure.ac和aclocal.m4文件生成configure文件。
AC_PREREQ(2.59)
AC_INIT(hello,1.0,yangzongde@) //在此行内容中设置当前软件包信息
AM_INIT_AUTOMAKE(hello,1.0) //automake所必备的宏,必须添加
AC_CONFIG_SRCDIR([hello.c]) //源文件名
autoscan.log configure.ac configure.scan hello.c
[root@localhost hello]# cat configure.ac

codemaker用法

codemaker用法

codemaker用法CODEmaker用法详解什么是CODEmaker?CODEmaker是一款强大的创作工具,旨在帮助用户轻松地创建和分享代码示例。

它提供了丰富的编辑器和模板,使得编写和展示代码变得简单易行。

CODEmaker的特点•提供多种编程语言支持,包括Java、Python、JavaScript等。

•内置代码高亮功能,使代码更具可读性和美观性。

•支持多种代码格式,如函数、循环、条件语句等。

•可以将代码示例嵌入到网页、博客或其他文档中,并进行灵活的自定义样式设置。

用法一:创建代码示例1.打开CODEmaker,选择所需的编程语言。

2.在编辑器中编写代码示例,可以使用各种语法和函数。

3.通过设置样式和主题,使示例代码更具可读性和美观性。

4.添加注释和说明,以便他人更好地理解代码的作用和逻辑。

5.保存代码示例,以便后续使用。

用法二:分享代码示例1.选择要分享的代码示例。

2.点击分享按钮,在弹出窗口中选择分享方式,如复制链接、生成二维码等。

3.将分享链接或二维码发送给他人,让他们可以访问和查看代码示例。

4.可以选择设置访问权限,如公开分享或仅限特定用户。

用法三:嵌入代码示例1.在CODEmaker中选择需要嵌入的代码示例。

2.点击生成嵌入代码按钮,CODEmaker将生成嵌入代码的HTML代码。

3.将生成的HTML代码复制到需要嵌入代码示例的网页、博客或其他文档中。

4.根据需要进行自定义样式设置,以使嵌入的代码示例与文档整体风格一致。

用法四:导入和导出代码示例1.在CODEmaker中,点击导入按钮,选择要导入的代码示例文件。

2.CODEmaker将自动解析文件中的代码,并将其展示在编辑器中。

3.编辑和修改代码示例。

4.点击导出按钮,选择导出方式,如保存为文件或复制代码。

5.根据需要进行导出格式的设置,如选择导出为代码文件还是Markdown文档。

用法五:自定义样式设置1.在CODEmaker中,点击样式设置按钮。

cmake里的macro用法

cmake里的macro用法

cmake里的macro用法在CMake 中,macro 是一种定义重复使用代码的方法。

与函数类似,一个macro 也可以接受参数。

定义一个macro 的语法是:```macro (macro_name arg1 arg2 ...)...endmacro ()```其中,`macro_name` 是你定义的macro 名称,`arg1`、`arg2` 等是macro 的参数。

在`...` 中,你可以使用这些参数,并编写需要执行的代码。

使用一个macro 的语法是:```macro_name (arg1_value arg2_value ...)```其中,`arg1_value`、`arg2_value` 等是你传递给macro 的参数的具体值。

以下是一个简单的例子:```macro (print_message message)message ("${message}")endmacro ()print_message ("Hello, World!")```在这个例子中,我们定义了一个名为`print_message` 的macro,它接受一个`message` 参数。

在macro 的实现中,我们使用了`message` 命令来输出这个参数。

最后,我们通过`print_message` 调用macro,并传递了一个字符串参数"Hello, World!"。

执行结果是将这个字符串输出到屏幕上。

请注意,macro 中定义的变量和函数只在macro 中有效,不会影响到外部的变量和函数。

如果需要在macro 中定义的变量或函数在外部可用,需要使用`set` 命令或`function` 命令来定义。

这就是CMake 中macro 的用法。

使用macro 可以帮助我们避免重复编写代码,提高代码的可维护性和复用性。

CMake基础教程

CMake基础教程

CMake基础教程如果需要配置和检查我们⼯程中的所有依赖,那么可以选⽤CMake⼯具;但是,这并不是必须的,因为我们可以使⽤其他的⼯具或者是IDE(⽐如Makefiles或者Visual Studio)来配置我们的⼯程。

然⽽,CMake是最好移植的⽅式来配置多平台的C++项⽬。

1. 基本⽤法 CMake使⽤名称为CMakeLists.txt的⽂件,其中定义了编译和依赖处理等过程。

对于⼀个基本的项⽬⽽⾔,从⼀个源码⽂件构建⼀个可执⾏程序只需要中CMakeLists.txt⽂件中添加两⾏代码即可。

⽂件内容像下⾯这样:cmake_minimum_required (VERSION 2.6)project (CMakeTest)add_executable (${PROJECT_NAME} main.cpp) ⽂件的第⼀⾏定义了所需的CMake版本的最⼩值,这⼀⾏是强制添加在CMakeLists.txt⽂件中,其拥有指定了从第⼆⾏开始可以使⽤的给定版本所定义的cmake函数;第⼆⾏的project函数⽤于定义⼯程名(这⾥为CMakeTest),这个名字被保存在⼀个名为PROJECT_NAME的变量中。

最后⼀⾏,在main.cpp⽂件中创建⼀个可执⾏命令(add_executable()),它的名字和⼯程名称(${PROJECT_NAME})相同,然后将源代码编译到名称为CMakeTest的可执⾏⽂件中,也就是将可执⾏⽂件名设置为与⼯程名相同。

${}表达式允许访问环境中定义的任何变量,因此,我们可以使⽤${PROJECT_NAME}变量作为⼀个可执⾏程序的输出名。

假设这⾥的main.cpp⽂件是⼀个简单的Hello World程序,代码如下:#include <iostream>using namespace std;int main(int argc, char *argv[]){cout << "Hello World! " << argc << argv[0] << endl;return0;}将这两个⽂件放置在同⼀⽬录下,然后依次执⾏如下命令:cmake .make这样,我们就可以在当前⽬录下⾯看到⼀个名称为CMakeTest的可执⾏⽂件了。

cmake makefile使用

cmake makefile使用

cmake makefile使用一、概述CMake和Makefile都是用于管理和构建C/C++项目的工具。

其中,Makefile是Unix/Linux系统下最常用的构建工具之一,而CMake则是一个跨平台的构建工具。

二、Makefile1. Makefile是什么?Makefile是一个文本文件,用于指定如何编译和链接程序。

它包含了编译器需要执行的指令,以及指定源代码文件和目标文件之间的依赖关系。

2. Makefile语法Makefile由一系列规则组成,每个规则包含了以下内容:- 目标文件:需要生成的文件名- 依赖文件:生成目标文件所需要的源代码或其他目标文件- 命令行:生成目标文件所需要执行的命令例如:```target: dependency1 dependency2command1command2```其中,“target”表示目标文件,“dependency1”和“dependency2”表示依赖文件,“command1”和“command2”表示生成目标文件所需执行的命令。

3. Makefile使用方法在Linux系统中,可以使用make命令来读取并执行Makefile中的规则。

make命令会自动检测源代码和目标代码之间的依赖关系,并根据规则自动编译程序。

例如,在当前目录下有一个名为“test.c”的源代码文件,并且在同一目录下有一个名为“Makefile”的文件,其中包含以下规则:test: test.cgcc -o test test.c```则可以使用以下命令来编译程序:```make```4. Makefile的优缺点优点:- Makefile可以自动检测源代码和目标代码之间的依赖关系,只需要编写简单的规则即可。

- Makefile可以在不同的平台上使用,具有很好的可移植性。

缺点:- Makefile语法比较繁琐,需要编写大量的规则。

- Makefile无法自动处理一些复杂的依赖关系,需要手动编写规则。

Cmake使用教程

Cmake使用教程

Cmake使⽤教程Cmake 使⽤教程CMake是⼀个⽐make更⾼级的编译配置⼯具。

它可以根据不同平台、不同的编译器,⽣成相应的 Makefile 或者 vcproj 项⽬。

通过编写CMakeLists.txt,可以控制⽣成的 Makefile,从⽽控制编译过程。

CMake ⾃动⽣成的 Makefile 不仅可以通过 make 命令构建项⽬,⽣成⽬标⽂件,还⽀持:1. 安装(make install)、2. 测试安装的程序是否能正确执⾏(make test,或者ctest)、3. ⽣成当前平台的安装包(make package)、4. ⽣成源码包(make package_source)、5. 产⽣ Dashboard 显⽰数据并上传等⾼级功能,6. 只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试⽤例。

7. 如果有嵌套⽬录,⼦⽬录下可以有⾃⼰的 CMakeLists.txt。

总之,CMake是⼀个⾮常强⼤的编译⾃动配置⼯具,⽀持各种平台,KDE 也是⽤它编译的,感兴趣的可以试⽤⼀下。

// ----------------------------------------------------------------------------------//-----------------------------------------------------------------------------------我们需在 CMakeLists.txt ⽂件中指定如下⼏项,cmake版本、⼯程名、构建⽬标app的源⽂件(1)cmake 版本: cmake_minimum_required(VERSION 3.11)(2)指定⼯程名:project(My_project_Yuejie)(3)指定安装⽬录:set(CMAKE_INSTALL_PREFIX "/usr/local/yzhang")(4)设置 C++ standard :set(CMAKE_CXX_STANDARD 11);set(CMAKE_CXX_STANDARD_REQUIRED ON)(5)add_subdirectories :添加外部项⽬⽂件夹(6)include_directories :将指定⽬录添加到编译器的头⽂件搜索路径之下(7)“是指定义了顶级 CMakeLists.txt 的⽂件夹(8)“cmake_c_flags” “cmake_cxx_flags”:⽤来设置编译选项-Wall : ??-Wextra: ??-ggdb: ??-Wno-missing-field_initializers : ??(9) list :(1)LENGTH 返回list的长度(2)GET 返回list中index的element到value中(3)APPEND 添加新element到list中(3)FIND 返回list中element的index,没有找到返回-1(4)INSERT 将新element插⼊到list中index的位置(5)REMOVE_ITEM 从list中删除某个element(6)REMOVE_AT 从list中删除指定index的element(7)REMOVE_DUPLICATES 从list中删除重复的element(8)REVERSE 将list的内容反转(9)SORT 将list按字母顺序排序(10)option :添加编译选项。

cmacro在linux中的用法

cmacro在linux中的用法

cmacro在linux中的用法1.简介c m ac ro是一种宏处理器,用于在Li nux中进行代码宏展开。

本文将介绍cm ac ro在L inu x中的用法,并提供一些示例来展示其功能和灵活性。

2.安装cma cro在开始使用c ma cr o之前,首先需要在Li n ux系统中安装c ma c ro。

可以通过以下步骤完成安装:1.打开终端。

2.输入以下命令来安装cm ac ro:```b as hs u do ap t-ge ti ns tal l cm ac ro```3.等待安装完成后,就可以开始使用cm a cr o了。

3.cm acro的基本用法3.1宏定义和宏展开使用cm ac ro,我们可以定义宏,并在代码中进行宏展开。

下面是c m ac ro的基本用法示例:```c#i nc lu de<s td io.h>#d ef in eM AX(a,b)((a)>(b)?(a):(b))i n tm ai n(){i n tx=10;i n ty=20;i n tm ax=M AX(x,y);//宏展开p r in tf("Ma xv al uei s%d\n",ma x);r e tu rn0;}```在上面的示例中,我们使用宏`M AX(a,b)`定义了一个求两个数中较大值的宏。

然后,我们在`m ai n`函数中使用宏展开将其替换为具体的代码。

最终结果将输出较大的数。

3.2宏嵌套和参数化除了基本的宏定义和展开,c ma cr o还支持宏的嵌套和参数化。

下面是一个示例来说明这一点:```c#i nc lu de<s td io.h>#d ef in eM AX3(a,b,c)(M AX(M AX(a,b),c))#d ef in eM AX(a,b)((a)>(b)?(a):(b))i n tm ai n(){i n tx=10;i n ty=20;i n tz=30;i n tm ax=M AX3(x,y,z);//宏展开p r in tf("Ma xv al uei s%d\n",ma x);r e tu rn0;}```在上面的示例中,我们定义了一个嵌套的宏`MA X3(a,b,c)`来求三个数中的最大值。

Make使用说明

Make使用说明

Make 使用说明Make是一种代码维护工具.在大中型项目中,他将根据程序各个模块的更新情况,自动的维护和生成目标.能很好的做到”不多”,”不重””不漏”.不多:他只更新那些需要更新的文件,而不懂那些并不过时的东西不重:是指当make对某个文件进行更新时,即使有很多文件过时,他也将只更新一次,当然,这一次就足够了不漏:是指他不会漏下任何应该更新的文件.1.make的基本使用make在使用时有一系列的规则,他将根据这些规则来解释他的配置脚本,以达到它的设计目的.这个配置脚本的缺剩名是makefile ,Makefile.也可以用其它文件名.我们这里所讲的make的应用就是怎样写出高效,简洁,正确的makefile文件.Make的使用形式为Make [option] [macrodef][target]Option指出make的工作行为,make的具体选项有:-c dir make在开始运行后的工作目录为指定目录-e 不允许在makefile中队环境的宏赋值-f filename 使用指定的文件作makefiel-k 执行命令出错时,放弃改目标去维护其它目标-n 按实际运行时的执行顺序现实命令,包括用@开头的命令,但不振的执行-p 现实makefile中所有的宏定义,河内部规则-r 忽略内部规则-s 执行但不显示命令,常用来检查makefile的正确性-S 执行make时出错即退出-t 修改每个目标文件的创建日期,但又不正的创建-V 打印make的版本号-x 将所有的宏定义输出的shell环境中-i忽略运行make中的错误,而又不退出make在使用make维护目标的时候,为了调试错误,常使用 make 2 >; errofile.这样错误信息就都写入了errofile2.makefile 的基本书写make使用的依据是依赖关系.如工程example ,他依赖于main.o e1.o e2.o,而main.o 依赖于main.c l.h,e1.o依赖于e1.c l.h ,e2.o 依赖于e2.c.这样就形成一棵树.及双亲节点,依赖于孩子节点.当make 进行维护时.他呼对这棵树.进行一次后序遍历.如果发现孩子节点形成的时间晚于双亲节点形成的时间.便开始维护.原理十分简单.现在,我们开始,我们的主要内容: 如何书写makefilemakefile 是供make 使用的一个配置脚本.他是按一定的规则写成的.它的组成是以一个要维护的目标为一个单元,每个单元的书写形式如下:要维护的目标列表要维护的目标属性分割符(一般为:) 依赖的文件列表命令行的属性 ;第一条命令tab键命令1…..需要说明的是,第一条命令可以加; 跟在依赖文件列表后,也可以和其它的命令另起一行写.一定要记得加tab键.否则make 不认识.当一条命令太长一行放不下是使用/l来换行.注释行用#开头.这样一来.我们前面举的例子就可以写成这样的makfileexample : main.o e1.o e2.ogcc -o example main.o e1.o e2.omain.o :main.c l.hgcc -c main.ce1.o :e1.c l.hgcc -c e1.c l.he2.o:e2.cgcc -c e2.c可以用cat -e -v-t makefile 其中-v-t可以让tab键显示^I ,是makefile 的末尾显示$,这样可以检验,makefile的正确性.可见,书写一个简单的makefile文件并不困难.然而在大中型项目中.要通过makfile 做大量的维护与调试.这样会是程序员增加很大的工作量.因此,make 引入了一些属性变量,和宏变量,来控制make .甚至可以像c预言的条件编译那样.通过一些shell语句来控制.接下来.我们将一一讲解.3.makfile中的属性控制2.2.1分割符分割符一般用: 但也用::,:!:^,:-一下举例说明一下这几个分割符的作用一般目标文件只能出现一次.只有使用::时才可以出现多次如:a.o::a.c#命令1a.o::b.c#命令2意思是:如果a.c更新.使用命令1.b.c更新使用命令2:^ 将指定的依赖文件和目标文件一有的依赖文件结合起来:- 清除目标文件原有的依赖文件,将指定文件为目标文件的唯一依赖文件:! 对每个更新过的依赖文件都执行一遍命令菜单如:a.o :b.ca.o:^ c.c此时a.o 的依赖文件是b.c 和c.ca.o:- a.c此时 a.o 的依赖文件只剩下a.c了2.2.2 命令行属性命令好属性较简单只有三种+ 当运行条件成熟(依赖文件过时) 始终执行,即使 make 有 -n -q -t 选项- 当此行出错时,忽略继续运行make@ 不显示本行命令(make 执行使命令行在屏幕上打印)2.2.3 目标文件属性目标属性比较多.这里举几个常用的例子.IGNORE 类似于命令行中的减号,在本目标维护出错时.并不马上退出make 而是继续运行.SILENT 类似于命令行中的@ ,维护本目标时不在屏幕上显示.PRECIOUS 保留中间文件.LIBARY 说明维护的目标是一个库.SYMBOL 说明维护的目标是指定入口的库成员.LIBRARYM 说明维护的是库的一个成员在使用目标文件的属性时有两种方法.IGNORE main.o e1.o 和main.o .IGNORE : ….……e1.o .INGORE :…..…….效果是相同的,在实际使用时,可以根据个人的具体情况使用.2.2.3 伪目标在make 中有两类目标,一类是实目标.一类是伪目标.伪目标不要求make生成世纪的目标文件,只是完成一些辅助性的工作,如打印,删除等.伪目标有两种.一种是任意给出名字如: lp:pr *.c/lp将所有的源文件分页打印.由于系统中没有lp 文件,他总是认为是过时的,因此这个命令总被执行.另一种方式是使用linux提供的伪目标.ERRO :依赖文件命令行作用时,一旦遇到错误时,执行命令行.INCLUDE :file1 file2作用是: 将文件包含进来,注意:这里的包含不是指针的转移而是拷贝.INCLUDE /usr.INCLUDE file1make 首先在当前目录下寻找file1,如没有则在/usr下找.另一种使用方法是:/INCLDE <;dir/filename>;.IMPORT 将一些宏载入 .如:.IMPORT shell 这样makefile 便可以使用shell 里的宏了..EXPORT 和.IMPORT恰恰相反.是将makefile里定义的宏,输出到环境.不赘述.当需要维护几个目标时可使用这样的伪目标:all: main.o main1.o ….重要说明是: 命令行属性>;>;目标文件属性>;>;make 命令行属性我们在各种应用中已熟悉宏的概念.不赘述.在make 中使用宏也要先定以后使用.宏名可以是任意数字.字母下划线的组合. 不过不能用数字开头.宏的定义方式有3种= 直接将后面的字符串赋给宏:= 后面跟字符串常量,将他的值赋给宏+= 宏原来的值加上一个空格,将它的内容赋给宏宏的应用各是有两种:$(宏名) 或 ${宏名}宏名可以嵌套使用.如h2=mylib.aindex=2则在makefile 中调用$(h$(index)) ,就等于调用 mylib.a.使用shell 环境的宏.不需要定义.只要用.IMPORT 在如就行.3.2 内定义宏控制宏为了控制make 的属性,定义了一系列的内定义宏.分为两类.控制宏用于控制make 的属性.属性宏代表一些特殊的值.控制宏:.DIREPATR 表示路径中用于分割目录与文件的分割符一般为 /.MAKDIR 调用make的绝对路径名.NULL 空字符串.PWD 运行make 时活动目录的绝对目录名.SHELL 运行是的shell 名另一类宏.我们成为属性宏.和目标文件的属性书写和意义都相同.用于设置这些属性.如.IGNORE=yes将整个makefile里的目标文件都设为.IGNORE.其它的属性宏.和目标文件属性里面的相同.3.3 动态宏引入动态宏的目的是,简化makefile的书写.他利用了很多一用的代码.但给makefile 带来了不可读性$@ 当前目标文件的名字$% 同$@,不过若维护的目标是库时.$@指库名 $% 指库成员$>; 适用于lib(member)的情况$>;指库名如$@$* 目标文件,去掉后缀$&; 当前目标文件.在所有依赖文件$^ 当前目标文件在本单元中的依赖文件$? 当情目标文件在所有单元中比目标新的依赖文件$<; 当前目标文件在本单元中比目标文件新的文件这些宏只能用在命令行中.make 提供可与此对应的动态宏用在依赖文件中.他们分别是在上面的宏上在加一个$$$@ 在依赖文件列表中,代表目标文件的名字等等.这样,我们原先的makefile便可以写成:example:main.o e1.o e2.ogcc -c $?main.c e1.c:$$*.c l.he2.c :$$*.cgcc -o $*.c3.4 宏的修改一个宏定义以后.可以用make的某些功能.对其进行修改1,如:file=/usr/l/main.c 引入修改描述符:d :仅展开目录b :仅展开文件名,不包括扩展名f :展开全名这样$(file:d)等于main . 其它的类推2,替换宏中的字符串规则宏名: s /远字符串/新字符串file =file1.o file2.o file3.ofile:s/file/fun则file=fun1.o fun2.o fun3.o3.还有宏名:^前缀宏名:+后缀file= a b cfile=^";1";则file=1a 1b 1c4.内部规则4.1make 的内部规则是系统或者后呼吁定义的一些规则.他在定义时.不必指出全名.只是定义了一些最常用的依赖关系和依赖命令.和c 编程有关的就以下.这几种情况与c编程又过的文件扩张名是.o 目标文件.c c语言源文件.C c++语言源文件.h 头文件与c 相关的规则主要有.c:$(CC)$CFLAGS)-O $@ $<;.c .o:$(CC)$CFLAGS)-c $@ $<;这里面使用到了一些宏.以上两句话的意思是对.c 文件缺剩是的编译.和编译成.o 文件.有必要说一些宏的定义宏名初始值说明AR Ar 库管理命令ARFLAGS -ruv 库管理命令选项CC cc C编译命令CGLAGS -o C编译命令选项C++C CC C++编译命令C++FLAGS -O C++编译命令MAKE make MAKE命令MAKEFLAGS NULL MAKE命令选项LIBSUFFIX .a 库的扩展名A .a 库的扩展名有了内部规则.我们的makefile 会更加简练如原先的makefile 我们可以写成example:main.o e1.o e2.ogcc -o example main.o e1.o e2.omain.o e1.o :l.h4.2修改和定义内部规则修改内部规则.可以有两种办法:一是修改内部规则用到的宏.而是直接修改内部规则的命令行如我们前面提到的规则:.c .o:$(CC)$(CFLAGS)-c $@ $<;我们只要定义 CC=6788 其命令行就变成了 6788 -O -c $@ $<; 原因是makefile 内部的宏定义大于make 的默认定义至于写该命令行,直接在makefile 中写就行了.他会踢换掉默认的定义如.c .o:$(CC) -c $@ $<;就会以下面这个定义为主对于一些没有的后缀名可以自己定义,各时如:new roman 后缀名1 后缀名2 ….SUFFIXES .n 就定义了一个新的后缀n .从目标文件生成文字表文件的命令是:nm 目标文件 >; 名字表文件现在我们定义一个内部规则,即.o 文件依赖于通明的.o 文件.SUFFIXES .n.o.nnm $<; >; $@这样的话.make 会根据.o文件的更新,自动的维护.n 文件5.库的使用5.1库的建立和维护在开发大中型软件时.常把一些编译好的模块同意放到一个库中.在编译时可以节省时间和空间.库中的文件一般成为库的成员.成员的表示形式一般为库名(库成员名) 如: mylib(myrea.o) 用make 维护库时,我们将库名作为目标文件格式如下:库名: 库名(库成员名1) 库名(库成员名2) 库名(库成员名3)make 遇到这样的命令行 ,自动吧库名当成目标文件,并赋予.LIBRARY属性例如:mylib.a :mylib.a(myread.o) …也可以这样定义mylib.a .LIBRAAY :myread.o …还有一种定义方式是:库名: ((rentry))make 遇到这种情况,把库名置成.LIBRARY 把entery 置成 .SYMBOL.然后根据entry 找到相应的文件以后的处理和直接些文件相同make 从.o 文件维护库的命令是ae -ruv 库名目标文件名如维护一个名为mylib的库.makefile 需要这样写mylib:mylib(f1.o)gcc -c fi.car -ruv muylib f1.orm -f f1.omylib:mylib(f2.o)gcc -c f2.car -ruv muylib f2.orm -f f2.o……利用动态宏我们可以将他该成这样:mylib:mylib(f1.o f2.o…..)gcc -c ($?:b).car -ruv $@ $?rm -f $@我们也可以利用内部规则,来简化所有makefie 中库的维护.o.a:$(AR) $(ARFLAGS) $@ $?rm -f $?然后库的makfile 写成mylib: mylib(f1.o) mylib(f2.o)………还有一条内部过则是:.amake $@即make 将自动维护所有的库5.2 利用库进行连接使用库进行连接时.只需要将库名.o文件名说明就行.形式如下:库名(库成员名) 或库名(((成员entery))例如想在有一可执行程序eampl2.exe 依赖于mylib 中的f1.o ,在makefile 中可以这么写:eampl2.exe:mylib(f1.o)#连接命令行(一般是ld)make 读到这样的规则就知道mylib 是一个库.有.LIBRAAY的属性f1.0 是库的成员函数有.LIBRAYM的属性eampl2.exe 依赖于f1.o在这里也有意跳内部规则.o.e$(LD) $(LDFLAGES) -o $@ $<; $(LDLIB)其中宏的定义是LD 连接命令ldLDFLAGEA ld 的选项]LDLIB 库名列表因此只要把你自己定义的库,加到库名列表中,在使用内部规则就行了.如上例可以写成: LDLIB+=mylib.a # 将自定义的库加到库名列表中去eaple2.exe:mylib(f1.o)7.条件编译make 中还引入了一些shell 语法.以帮助进行类似于c 语言的于编译的功能.下面是在linux核心的makfile 中抄来的一段.我们可以看一下他是如何进行条件维护的ifeq (.config,$(wildcard .config))include .configifeq (.depend,$(wildcard .depend))include .dependdo-it-all: Version vmlinuxelseCONFIGURATION = dependdo-it-all: dependendifelseCONFIGURATION = configdo-it-all: configendif类似于c 语言的 if else 语句.不同的是他是比较两个值是否相等,来判断是否满足条件.因为在makefile中.很多值是由字符串组成的,所以这个于就十分有用.还有这样的语句:ifdef CONFIG_PCIDRIVERS := $(DRIVERS) drivers/pci/pci.aendif这个语句够简单,我多说什么了.如何使用make在shell的提示符号下,若键入"make";,则它会到目前的目录下找寻Makefile这个文件。

Install Cocreate17.0安装中文流程

Install Cocreate17.0安装中文流程

CoCreate 17.0Install Guide-中文版本For Engineer一、安装主机License管理程序1.打开License_Server_17.0安装文件,出现License Server安装提示框。

点击<Next>:2.填写基本信息,默认即可:3.提示安装路径,如需更改可按Change设定你要安装的路径,此处推荐默认路径:4.Install完成后弹出Configuration 界面,在[Hardware ID]标签下选择网卡ID,点击右下角Apply:5.然后转到[License Configuration]标签下,点击[Create/Edit]创建Mels文件,此时弹出创建文件的确认框,点击确定,并把License中的内容复制到此文件中,保存并关闭。

点击右下角的[Apply],设定结束,点击[Finish]:6.Mels 安装完成,点击Finish 。

二、安装Cocreate 软件客户端1.放入Cocreate17.0安装光盘,系统会自动运行光盘上的安装程序。

如果没有自动运行,请双击[我的电脑]打开安装光盘,文件夹下<Setup.exe>,出现CoCreate17.0安装界面,点击<Next>:2.选择需要安装的产品,基本的只要选择<Cocreate Modeling>,如果购买了其他的如Data Adapters转档产品可以选择:3.出现安装的信息,主要讲述安装的路径和安装的内容,按<Next>;4.进入Modeling安装界面,点击Next.5.接受安装协议,点击Next:6.选择安装路径:7.选择安装方式<Typical>;如果选择Custom的方式,点击Next,可以弹出如下界面选择安装的内容;推荐选择[Typical]。

点击Next。

8.选择服务器的机器名称,如果是本机安装,选上<Use local host>。

so静态分析进阶练习——一个CreakeMe的分析思路

so静态分析进阶练习——一个CreakeMe的分析思路

so静态分析进阶练习——⼀个CreakeMe的分析思路说明拿到⼀个CreakeMe,写⼀个分析思路。

CreakMe主要是对.so⽂件内容进⾏分析,当然很多学习Android逆向的在分析到smali代码的时候就已经停⽌脚步了。

在接触到.so⽂件的时候才是开始进⼀步的逆向学习,当然这⾥就要学习ARM汇编了。

关于ARM汇编在⽹上有很多的资料,这⾥就不再赘述。

导航请使⽤:0×01 分析逻辑1.初始界⾯2.输⼊数字3.输⼊字符4.总结尝试使⽤App得出这些结论。

1.我们需要⼀个key。

2.这个key是数字。

0×02 java层逻辑分析逆向拿到smali代码。

⼯具:Android Killer。

1.逻辑分析找到⼊⼝MainActivity。

我们看到这⾥有⼀段代码:这段代码的作⽤就是调⽤so⽂件库。

我们猜测这个App很有可能把关键key写在了so⽂件⾥。

我们从onClick⽅法定位到关键点。

这⾥是判断正误的地⽅,这⾥看到如果v0和v2的值不相等的话就跳转。

并且这⾥v2的值是1。

我们向上看。

这⾥有⼀个调⽤⽅法。

在这⾥我们看到这个是Native层的⽅法。

并且这个⽅法会返回⼀个int数据,这⾥猜测可能会是0或者1。

在这⾥还有⼀个就是传⼊的是⼀个int 型数据,根据我们之前的测试,知道这⾥就是我们从输⼊框输⼊的内容。

2.逻辑图猜测监听事件——输⼊key——key⽅法判断——返回0或11为正确,0为错误。

但是我们依然没有找到Key的是指内容。

0×02 Native层分析so逆向使⽤⼯具:ida1. key⽅法分析找到关键的Key函数。

这⾥可以看到ARM汇编⽐smali难的可不是⼀个度两个度。

为了提升能⼒,我们还是⼀句⼀句的分析。

如果是学习的话,请不要依赖F5。

PUSH {R7,LR}把R7寄存器和LR⼊栈。

R7的含义就是指向前⼀个保存的栈帧和链接寄存器在栈上的地址。

这⾥可能会对LR的作⽤不知道,简单的说⼀下,LR的作⽤⼀个是保存⼦程序的返回地址。

conmaker_gai使用手册范本

conmaker_gai使用手册范本

第一章软件使用简介本部分内容为ConMaker 软件使用的入门介绍,目标是:使熟悉工业应用现场及WINDOWS 操作系统的用户通过此部分内容学习后,能读懂已完成的控制软件组态的基本含义,能进行简单的修改及查错、纠错,能独立进行简单的工程组态,包括新建工程文件、MACS 硬件配置,设置目标、任务配置、定义变量、创建POU(程序组织单元,以下简称程序)、添加库、在创建的程序中用CFC 进行简单组态、编译、通讯参数设定、下装、运行。

第一节软件安装本公司Conmaker软件的安装平台是Windows NT4.0 +Service Pack 6。

1 Conmaker软件的安装:(1)把安装光盘放进光驱内;(2)打开[我的电脑],在光盘上找到SmartPro中的conmaker setup文件夹,双击此文件夹中的setup.exe程序。

图2-1 启动setup.exe(3)只需连续点击Next(下一步),即可完成。

如图示:图2-2 进入安装界面接受《许可协议》:图2-3 接受许可界面安装路径D:\SmartPro\Conmaker:图2-4 选择安装路径开始安装:图2-5 安装进度条(4)其中需注意要点为:在工程中,一般建议将此软件安装在D:\SmartPro\Conmaker目录下。

2 目标安装:Hollysys Codesys Sp for QNX在NT的“开始”——“程序”——“Hollysys SmartPro”——点击“安装目标”,出现如下图形:图2-6 目标安装界面点击open,弹出:图2-7 路径界面选择hollysys.tnf,点击“打开”。

于是在Possible Targets框内出现beijing hollysys,将加号展开。

点击“Install”按钮,在Installed Targets里也会加入beijing hollysys,最后展开加号“+”。

“close”关闭此窗口。

图2-7 添加成功提示:此处所提到的目标安装,其主要目的就是将系统相关的硬件配置文件安装到C 盘中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Comake2使用详解1、适用用户范围:第一次使用comake2工具使用comake2搭建环境:这时用户不需要关心COMAKE文件细节,和第一次使用comake2工具时的情形差不多,第一次使用comake2工具初始化环境$mkdir --parent ps/se/ac/make$cd ps/se/ac/make$comake2 -S$comake2 -UBcomake2 -S //初始化COMAKE文件comake2 -S表示从平台最新基线版本获取依赖列表;comake2 -S -r 1.0.1.0表示从平台1.0.1.0版本获取依赖列表友情提示:如果你的代码库里已有COMAKE文件,可跳过这一步;如果你的模块路径是ps/se/ac/make,请cd ps/se/ac/make再执行comake2 -S命令comake2 -UB //下载并编译依赖代码2、comake2命令$ comake2 -hcomake[com make]能够自动帮助用户搭建环境,并且生成Makefile工具.程序会读取目录下面的COMAKE文件,产生Makefile和环境.用户需要提供这个COMAKE文件. 参数:-h --help 查看帮助-D --debug 开启debug选项[默认不打开].-D -D可以查看更多调试信息.-S --scratch 创建一个默认的COMAKE文件-r --revision 从平台检出模块cvspath指定的TAG对应的依赖列表,配合-S使用,如-S -r 1.0.0.0-E --export-configs 导出模块的4位版本依赖,存放在COMAKE.CONFIGS下面.比如-E public/ub@1.0.0.0-W --watch-configs 查看本地依赖模块.-W -W可以查看模块引入来源.-W -W -W可以查看依赖模块的依赖.-I --import-files 在解释COMAKE文件之前导入模块-C --change directory 切换到directory下面执行[默认当前目录]-Q --quiet 安静模式[默认不打开]-U --update-configs 更新环境-B --build-configs 构建环境-F --force 构建环境时强制进行[默认不进行]-e --export-local-configs 导出本地环境到CONFIGS.SCM文件-f --scmfile= 重现编译环境-d --devdiff 存在本地修改的共同开发依赖列表(多模块共同开发时适用)-J --make-thread-number= 如果模块使用COMAKE生成的Makefile的话,编译线程数[默认是4]-j --modules-thread-number= 并发下载、编译模块的线程数[默认是1]-K --keep-going 构建/更新环境中途出错的话,忽略错误继续[已废弃]-P --pretreatment 生成Makefile时不进行预处理[默认进行预处理]-O --quot-all-deps 生成Makefile时引用所有头文件依赖[默认过滤目录外依赖]--parent-module 支持父子模块添加进编译依赖--no-recursive 不递归生成每个目录下面的Makefile[默认情况下是递归生成]--no-revert 不恢复依赖模块的本地修改,配合-U使用[默认恢复]--time-compile-link 计时编译和链接时间[默认不打开]--recache 强制更新comake2缓存的依赖列表--old-da 使用2.1.2及以前的依赖打平策略--new-da 最新打平策略在help中未列出的参数如下:--dump-da=da|dc|df|ds|dm 查看依赖完整关系图(分别以不同的形式组织,All|Collected|Flatten|Sorted|Map)-A --scmaudit 导出依赖树--old-api--conf 指定config文件CONF_FILE--dd= 和平台依赖模块进行对比# --dd and --dump-cfgs share same mode when analyzing deps.--dump-cfgs 列出所有依赖--dump-cfgs-scmpf= 列出平台依赖--get-remote-revision 与--dump-cfgs、--dd=等一起使用,获取依赖的代码当前最新版本--redirect-file= 与--dump-cfgs、--dd=等一起使用,将输出重定位到文件里--show-unstable-urls 与--dump-cfgs、--dd=等一起使用,列出不稳定的编译依赖--warn-downgrade-only 与--dump-cfgs、--dd=等一起使用,列出低版本--permissive-guilty-workroot 容忍错误的工作环境(只提示不退出)初始化COMAKE:comake2 -S搭建环境:基本命令是comake2 -UB,其中-U是下载代码,-B是编译模块并发搭建环境:comake2 -UB -j 4表示并发4线程下载和编译模块单线程编译:comake2 -B -J 1表示使用make命令编译某个依赖模块时不进行并发(如该依赖模块的Makefile不支持并发,则适用于该情况);强制重新搭建环境:comake2 -UB -F,即使依赖已经编译过,也会重新编译不revert本地修改:comake2 -UB --no-revert生成Makefile:comake2 [-P],-P会跳过预处理环节,加快生成Makefile的过程查看依赖完整关系图:comake2 -U --dump-da=da查看本地修改的编译依赖模块:comake2 -d和平台依赖进行对比:comake2 --dd=1.0.0.0重现编译环境:comake2 --scmfile=模块名.COMAKE.CONFIGS.SCM配置文件COMAKE语法#coding:gbk工作路径.层数=CVS路径的层数WORKROOT('../../')使用硬链接copy.CopyUsingHardLink(True)支持32位/64位平台编译ENABLE_MULTI_LIBS(True)C预处理器参数.CPPFLAGS('-D_GNU_SOURCE -D__STDC_LIMIT_MACROS -DVERSION=\\\"1.9.8.7\\\"')为32位目标编译指定额外的预处理参数CPPFLAGS_32('-D_XOPEN_SOURE=500')C编译参数.CFLAGS('-g -pipe -W -Wall -fPIC')C++编译参数.CXXFLAGS('-g -pipe -W -Wall -fPIC')IDL编译参数IDLFLAGS('--compack')UBRPC编译参数UBRPCFLAGS('--compack')头文件路径.INCPATHS('. ./include ./output ./output/include')使用库LIBS('./libci-tools.a')链接参数.LDFLAGS('-lpthread -lcrypto -lrt')依赖模块CONFIGS('lib2/ullib')为32位/64位指定不同的依赖路径.CONFIGS_32('lib2/ullib')CONFIGS_64('lib2-64/ullib')user_sources=''user_headers=''可执行文件Application('ci-tools',Sources(user_sources))静态库StaticLibrary('ci-tools',Sources(user_sources),HeaderFiles(user_headers))共享库SharedLibrary('ci-tools',Sources(user_sources),HeaderFiles(user_headers))子目录Directory('demo')编译标签元素名称作用example 注意事项WORKROOT 当前工作路径WORKROOT('../../') 最好使用相对路径MakeThreadNumber 使用多少个线程进行make MakeThreadNumber(4) 相当于执行使用make -j[废弃]CopyUsingHardLink copy使用硬链接CopyUsingHardLink(True)ENABLE_MULTI_LIBS 多环境编译ENABLE_MULTI_LIBS(True) 支持多环境编译,生成32位/64位通用的MakefileCPPFLAGS C预处理参数 CPPFLAGS('-DGNU\_SOURCE')CFLAGS C编译参数CFLAGS('-g -Wall','-O2')CXXFLAGS C++编译参数CXXFLAGS('-g -Wall','-O2')INCPATHS 搜索头文件路径INCPATHS('. ./include')这里不要加上-I前缀.INCPATHS允许使用$开头,代表路径相对于WORKROOT.比如INCPATHS('$public/ub')LIBS 链接使用的库文件LIBS('./libmock.a')LDFLAGS 链接参数LDFLAGS('-lpthread -lcrypto')IDLFLAGS IDL编译参数IDLFLAGS('--compack --ns=mock') 实际上是mcy的编译参数UBRPCFLAGS UBRPCGEN编译参数UBRPCFLAGS('--compack')PROTOFLAGS proto编译参数PROTOFLAGS('--proto_path=./')PROTOC protobuf路径 PROTOC('../../thirdsrc/protobuf/install/bin/protoc') ImportConfigsFrom 从其他目录的COMAKE继承编译依赖ImportConfigsFrom('..') ReplaceExtNameWith 替换文件后缀名ReplaceExtNameWith('x.cpp y.cpp','.cpp','.o') GetEnv 获得环境变量GetEnv('USER') 如果没有特定key的话,返回'undefined' BuildVersion 获取编译版本BuildVersion() 等效于GetEnv('COMAKE2_BUILD_VERSION') CCHECKFLAGS ccheck参数CCHECKFLAGS('-c cc.conf')PCLINTFLAGS pclint参数PCLINTFLAGS('-c pclint.conf')。

相关文档
最新文档