- 配置终端的C开发环境
在Ubuntu 终端系统中开发,需要依赖一些命令行工具,对比使用Windows 下的IDE集成开发环境会有一些不同之处。
在Linux 下一般使用gcc 编译C 语言代码,gcc 可以通过管理工具进行安装,以Ubuntu 16.04为例
sudo apt-get install gcc
新建一个C 语言程序进行编译演练,可以使用vim, 或者是touch命令来创建一个文件。
vim test.c / touch test.c
#include <stdio.h>
int main()
{
printf("study gcc\n");
return 0;
}
代码编辑完成后,使用gcc 命令进行编译
$ ls
test.c
$ gcc -o test test.c
-o 参数指定可执行程序名,test.c 是源码文件,当编译完成后,当前目录下会出现一个可执行文件test
$ ls
test test.c
在命令行下,将可执行程序运行起来,看是否会输出预期的内容:
$ ./test
study gcc
- 多文件编译
一般程序都是由多个文件组成,编译多个文件程序,需要将所有源码文件传给编译器。
以C语言为例,将test.c 拆解成两个文件,创建test2.c
touch test2.c
#include <strdio.h>
void print_test()
{
printf("study gcc\n");
}
test2.c 中定义一个函数,函数名为print_test, 用于输出 “study gcc”.
在test.c中直接调用print_test 即可:
test.c
void print_test();
int main()
{
print_test();
return 0;
}
按照以下步骤,编译由两个文件组成的程序:
gcc -o test test.c test2.c
- 解析编译流程
程序编译可以进一步分成为编译(Compile) 和链接(Link) 这两个阶段
我们可以分阶段编译test.c, test2.c,源文件如下:
$ ls
test.c test2.c
编译test2.c文件, 生成test2.o 对象文件:
$ gcc -c test2.c
$ ls
test2.c test2.o test.c
编译test.c文件,生成test.o 对象文件:
$ gcc -c test.c
$ ls
test2.c test2.o test.c test.o
最后链接两个对象文件,生成可执行程序:
$ gcc -o test test.o test2.o
$ ./test
stduy gcc
- 关于分阶段编译
分阶段编译的最大好处是, 可以进行部分编译 ==> 只是编译有变更的部分
在上面的例子中,test.c 有变更,而test2.c 没有变更,那么,我们只需要编译test.c 生成新的test.o 对象文件,最后再跟test2.o 文件链接生成新的可执行文件test。
可以省去编译test2.c 这段时间,如果文件较多,节省的编译时间就会很长。
- 使用Makefile 自动编译
touch Makefile
.DEFAULT_GOAL := run
test2.o: test2.c
gcc -o test2.o -c test2.c
test.o: test.c
gcc -o test.o -c test.c
test: test2.o test.o
gcc -o test test2.o test.o
run: test
./test
clean:
rm -f *.o
rm -f test
$ ls
Makefile test2.c test.c
$ make
gcc -o test2.o -c test2.c
gcc -o test.o -c test.c
gcc -o test test2.o test.o
./test
stduy gcc
执行make 命令
$ ls
Makefile test2.c test.c
$ make
gcc -o test2.o -c test2.c
gcc -o test.o -c test.c
gcc -o test test2.o test.o
./test
stduy gcc
Makefile 大致可以理解成 目标 、 依赖 以及 构建指令 。
缺省情况下,Makefile定义的第一个目标为默认目标,在第一行显式定义了默认目标,由于没有变更,再次构建时自动省略编译环节。
$ make
./test
study gcc
定义用于清理编译结果的目标 ==》 clean:
$ ls
Makefile test test2.c test2.o test.c test.o
$ make clean
rm -f *.o
rm -f test
$ ls
Makefile test2.c test.c
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。