一、GCC含义
最初含义为:GNU C Complier(在linux c编译器)
后来发展为:GNU Complier Collection(在linux下除c以外,还能编译c++,objectc等其他语言)
二、分步骤编译以及链接过程
假定存在如下文件列表
user.h
user.cpp
main.cpp
a). user.h:
b). user.cpp
c). main.cpp
以下操作是在windows上完成(安装了MINWG环境)
1. 单独编译每一个文件,包括main.cpp,为每一个cpp文件生成o文件
a). gcc -o user.o -c user.cpp
gcc -o main.o -c main.cpp
如下图:
b). 链接o文件成可执行文件,使用-l参数添加要使用的类库。由于在user.cpp中使用了 std::cout
gcc -o main user.o main.o -lstdc++
如下图:
其中生成的可执行文件为main.exe 可以指定任意你想要的名字,如:
注:windows下生成的可执行文件带有扩展名.exe,linux下不带扩展名(linux下该场景下生成的可执行文件为 main 或 custom_define)
c). 执行,查看结果
在当前目录下执行
./main.exe 或
./custom_define.exe
如下图:
注:linux下,该场景按如下执行:
./main
或
./custom_define
三、使用Makefile完成上述过程
对于少量文件,每次单个文件编译和链接还能接受,当源文件过多时,使用Makefile会很便捷。
a). 编写Makefile文件
如下图:
如果需要引用头文件和库文件
1、在Makefile文件的开头加入如下定义
MY_INC=-I /include路径
MY_LIB=-L/so文件路径 -lso文件名称
eg:
MY_INC==-I /usr/local/include/ImageMagick
MY_LIB=-L/usr/local/mysql/lib64 -lmysqlclient
2、在编译c文件的时候加入 inc变量
eg:
gcc -c usr.cpp -o user.o $(MY_INC)
3、在连接o文件生成可执行文件时,加入lib变量
gcc -o main \
user.o \
main.o -lstdc++ $(MY_LIB)
b). 将Makefile文件与源代码放到同目录下,默认执行make,来编译和链接生成可执行文件
如下图:
注:由于连接完成后删除了所有 .o文件,所以最后一个ls查看命令后,除了源文件和Makefile文件外,只有生成的可执行文件
c). 执行清除命令 make clean
如下图:
d). 执行make all 命令,清除后再执行编译连接(因为Makefile源文件中,all命令是分别执行 clean 和 test两步操作)
如下图:
e)由于Makefile中对编译和链接操作起的名字为 test(见Makefile源文件)
所以对于编译和链接生成可执行文件的过程,也可以通过执行 make test来完成
如下图:
这只是一个名字而已,可以任意起,比如abc也行。
如下图:
甚至clean和all都可以换成其他名字(比如将clean 换成cleans;all换成doall等任意名字)
在执行时,命令分别变成:
a). make
b). make abc
c). make cleans
d). make doall
大家自己可以尝试一下。