《系统程序员成长计划》学习交流(4)-Makefile释疑

【问题描述】

下述Makefile中:

all:
	gcc -Wall -g -DDARRAY_TEST darray.c -o darray_test
	gcc -Wall -g -DDLIST_TEST dlist.c -o dlist_test
	gcc -Wall -g -shared darray.c  dlist.c  linear_container_darray.c linear_container_dlist.c -o libcontainer.so
	gcc -Wall -g linear_container_test.c -L./ -lcontainer -o container_test
	gcc -Wall -g invert_ng.c -DINVERT_TEST -L./ -lcontainer -o invert_ng_test
	gcc -Wall -g invert.c -DINVERT_TEST -L./ -lcontainer -o invert_test
clean:
	rm *test *.so


-DDARRAY_TEST和-lcontainer怎么理解呢?

【分析】

(1) -DDARRAY_TEST

利用man gcc查看gcc手册, -DDARRAY_TEST在gcc手册中解释如下:

GCC(1)                                GNU                               GCC(1)

NAME
       gcc - GNU project C and C++ compiler

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...


可以看出-D后跟的是一个宏名。这个宏名为DARRAY_TEST。

这个宏名用于.c文件中,譬如dlist.c:

#ifdef DARRAY_TEST
...

int main(int argc, char* argv[])
{
	single_thread_test();

	return 0;
}
#endif


如果不指定宏名,上述宏包含的代码在预处理阶段就不会被包含。这样定义有个好处,那就是只有在gcc编译时,使用了-Dmacro标识,macro宏才会被预处理。这样,在一个工程中,如果包含多个main函数也没有关系,只要编译时,指定宏,执行相应的main就好了。

 

(2) -lcontainer

-lname链接成为libname.a(静态库)或者libname.so(动态库)的库文件。因此-lcontainer就是链接libcontainer.so文件。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值