不写 Makefile 文件,直接执行 make test。可以看到: make(其实是默认生成的 Makefile 文件) 默认使用 cc 编译器(不是 gcc)。
1 2 3 4 5
vimer@debian8light:~/see-the-world/code/make_learn$ ls test.c vimer@debian8light:~/see-the-world/code/make_learn$ make test cc test.c -o test ## Makefile 隐含规则生成的 gcc 执行语句,可以看到 # Makefile 倾向的书写方式
当目录下存在 test.o 文件时直接执行 make test 命令
1 2 3 4 5
vimer@debian8light:~/see-the-world/code/make_learn$ ls Makefile.bak test.c test.o vimer@debian8light:~/see-the-world/code/make_learn$ make test cc test.o -o test vimer@debian8light:~/see-the-world/code/make_learn$
扩展:我们看到上文中使用的都是 cc 编译器,我们更习惯 gcc/g++ 对不?而且有时候还需要给编译器指定参数,比如使用 c99 标准,怎么做呢?很简单,只需要在当前目录下新建以下 Makefile 文件:
1 2 3 4 5 6
# 指定编译器和选项 CC=gcc CFLAGS=-Wall -std=c99
CXX=g++ CXXFLAGS=-Wall -std=c++11
再次执行 make test 看看效果吧
1 2 3 4 5 6 7
vimer@debian8light:~/see-the-world/code/make_learn$ ls Makefile Makefile.bak test.c text.cpp vimer@debian8light:~/see-the-world/code/make_learn$ make test gcc -Wall -std=c99 test.c -o test vimer@debian8light:~/see-the-world/code/make_learn$ make text g++ -Wall -std=c++11 text.cpp -o text vimer@debian8light:~/see-the-world/code/make_learn$
vimer@debian8light:~/see-the-world/code/make_learn$ ls test.c vimer@debian8light:~/see-the-world/code/make_learn$ make test.o # 编译阶段不需要任何特殊处理 cc -c -o test.o test.c vimer@debian8light:~/see-the-world/code/make_learn$ make test # 报链接错误 cc test.o -o test test.o:在函数‘main’中: test.c:(.text+0x34):对‘sin’未定义的引用 collect2: error: ld returned 1 exit status <builtin>: recipe for target 'test' failed make: *** [test] Error 1 vimer@debian8light:~/see-the-world/code/make_learn$ make test LDLIBS=-lm # 使用 libm.so 库 cc test.o -lm -o test vimer@debian8light:~/see-the-world/code/make_learn$ ls source_learn test test.c test.o vimer@debian8light:~/see-the-world/code/make_learn$ ./test sin(30.00)=0.50 vimer@debian8light:~/see-the-world/code/make_learn$
自定义共享库
在使用 make & Makefile 文件生成可执行文件过程中,使用系统共享库和自定义共享库的区别在于:后者需要使用 LDFLAGS 变量指定路径。