首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

makefile 的 ifdef, ifeq 使用及辨析

#可以用命令行传递变量 RELEASE = abc #ifdef 变量名称不能加$() ifdef RELEASE $(warning RELEASE defined) else $(warning RELEASE not defined) endif #ifeq 后面参数要叫$(), 因为是值引用, 值可以为数值或字符串 ifeq ($(RELEASE),abc) $(warning RELEASE eqal abc) else $(warning RELEASE not equal abc) endif all: @echo ok! ************************************************** make 编译不同版本,例如debug, release 的简单示例。 用make 变量ver, 控制CFLAGS 变量,从而编译出不同版本。 [/pts/2@hjj ~/test]$ cat test.c #include <stdio.h> #include <unistd.h> int main(int argc,char *argv[]) { char *tty=ttyname(0); printf("tty is %s\n",tty); return 0; } [/pts/2@hjj ~/test]$ cat Makefile CC = gcc TARGET = test OBJS = test.o ifeq ($(ver), debug) $(warning ver is debug) CFLAGS = -g -Ddebug else $(warning ver is not debug) CFLAGS = -c -O3 endif $(TARGET): $(OBJS) $(CC) -o $@ $^ clean: rm test test.o 注释: makefile 采用了ifeq-else-endif 结构 可以判别莫个make变量是否定义。 make变量可以在makefile中定义,也可以由make命令行传递。 由于makefile 支持环境变量,所以你预先定义了环境变量,也可以不在命令行中传递而直接使用环境变量 这种机制使得编写脚本控制不同的复杂的编译成为可能, 例如支持各种地域的不同的版本。用地域变量,控制make的编译选项/D,控制编译出不同的版本 ---------------------------------------- 编译debug 版本, 从命令行传递变量 ---------------------------------------- [/pts/2@hjj ~/test]$ make ver=debug Makefile:6: ver is debug gcc -g -Ddebug -c -o test.o test.c gcc -o test test.o ---------------------------------------- 清理,无所谓版本信息 ---------------------------------------- [/pts/2@hjj ~/test]$ make clean Makefile:9: ver is not debug rm test test.o ---------------------------------------- 编译release 版本 ---------------------------------------- [/pts/2@hjj ~/test]$ make Makefile:9: ver is not debug gcc -c -O3 -c -o test.o test.c gcc -o test test.o

04
您找到你想要的搜索结果了吗?
是的
没有找到

openssl怎么编译成动态库

Windows下编译OpenSSL动态库的方法: 1、安装ActivePerl 初始化的时候,需要使用perl 2、使用VS下的Visual Studio 20xx Command Prompt进入控制台模式 3、解压缩openssl的包,通过cd命令切换到openssl的目录 4、执行:perl configure VC-WIN32 5、执行:ms/do_ms 6、选择不同的编译结果 1) 执行:nmake -f ms/ntdll.mak 该命令生成动态库,默认使用的是MD 2) 执行:nmake -f ms/nt.mak 该命令生成静态库,默认使用的是MT 3) 想生成使用静态链接运行时库的动态库则采用下面方法 复制一个ntdll.mak并命名为ntdll_mt.mak,修改里面的 “CFLAG= /MD /Ox ..............” 为/MT ,然后重新编译,执行 nmake -f ms/ntdll_mt.mak 4) 想生成使用动态链接运行时库的静态库则采用下面方法 复制一个nt.mak并命名为nt_md.mak,修改里面的 “CFLAG= /MT /Ox ..............” 为/MD ,然后重新编译 ,执行 nmake -f ms/nt_md.mak 7.其它命令: nmake -f ms/ntdll.mak clean // 清除编译的中间文件 nmake -f ms/ntdll.mak install // 安装 ,主要是linux下面会自动放到程序目录中 。

03

终端I/O---ttyS3: 3 inp

#include <stdio.h> #include "time.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> int main() {   struct termios opt;   int fd=-1;   int nread;   char buf[1024];   fd=open("/dev/ttyS3" ,O_RDONLY    |O_NONBLOCK); if(fd==-1)    {    printf("open /dev/ttyS3 error\n");    }   tcgetattr(fd,&opt);              //获取终端属性到opt   tcflush(fd,TCIOFLUSH);              //同时刷新收到的数据但是不读,刷新写入的数据但是不传送   cfsetispeed(&opt, B9600);                 //设置输入波特率   cfsetospeed(&opt, B9600);             //设置输出波特率   opt.c_cflag&=~CSIZE;              //(不用     )字符长度掩码。取值为 CS5, CS6, CS7, 或 CS8。   opt.c_cflag |=CS8;              //取值为CS8   opt.c_cflag &= ~PARENB;              //(不用     )允许输出产生奇偶信息以及输入的奇偶校验。   opt.c_iflag &= ~INPCK;              //(不用     )启用输入奇偶检测。   opt.c_cflag &= ~CSTOPB;              //(不用     )设置两个停止位,而不是一个   opt.c_cflag &= ~CRTSCTS;              //(不用     )硬件流控   opt.c_cc[VTIME] = 150;              //非 canonical 模式读时的延时,以十分之一秒为单位   opt.c_cc[VMIN] = 0;                      //非 canonical 模式读的最小字符数   opt.c_lflag    &= ~(ICANON | ECHO) ;              //(不用     )启用标准模式 (canonical mode)允许使用              //特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT,               //和 WERASE,以及按行的缓冲。              //(不用     )回显输入字符。   tcflush(fd,TCIOFLUSH);   tcsetattr(fd,TCSANOW,&opt);              //改变立即发生 while(1)     {         nread = read(fd,buf,1000);         //printf("nread=%d\n",nread);         //if(nread !=-1 )    printf("%s",buf);//打印数据         sleep(2);         memset(buf,0x0,1024);     } if(fd!=-1) close(fd);   return 0; }

01

makefile中的include的作用(makefile中的变量)

例子: 建立一个测试目录,在测试目录下建立一个名为sub的子目录 $ mkdir test $ cd test $ mkdir sub 在test下,建立a.c和b.c2个文件,在sub目录下,建立sa.c和sb.c2 个文件 建立一个简单的Makefile src=$(wildcard *.c ./sub/*.c) dir=$(notdir $(src)) obj=$(patsubst %.c,%.o,$(dir) ) all: @echo $(src) @echo $(dir) @echo $(obj) @echo “end” 执行结果分析: 第一行输出: a.c b.c ./sub/sa.c ./sub/sb.c wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。 第二行输出: a.c b.c sa.c sb.c notdir把展开的文件去除掉路径信息 第三行输出: a.o b.o sa.o sb.o 在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o, 任何输出。 或者可以使用 obj=$(dir:%.c=%.o) 效果也是一样的。 这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。 它的标准格式是 $(var:a=b) 或 ${var:a=b} 它的含义是把变量var中的每一个值结尾用b替换掉a 今天在研究makefile时在网上看到一篇文章,介绍了使用函数wildcard得到指定目录下所有的C语言源程序文件名的方法,这下好了,不用手工一个一个指定需要编译的.c文件了,方法如下: SRC = $(wildcard *.c) 等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样: SRC = $(wildcard *.c) $(wildcard inc/*.c) 也可以指定汇编源程序: ASRC = $(wildcard *.S) 这样一来,makefile模板可修改的基本就是AVR名称和时钟频率了,其它的一般不用动了。

05

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券