【问题描述】
下述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文件。