GCC含义、分步骤编译以及链接过程、Makefile写法

来源:互联网 发布:sqlserver导入sql脚本 编辑:程序博客网 时间:2024/04/30 02:49

一、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

大家自己可以尝试一下。

 

原创粉丝点击