菜小白笔记——交叉编译工具选项说明

源文件需要经过编译才能生成可执行文件。在Windows下进行开发时,只需要单击几个按钮即可编译,集成开发环境已经将各种编译工具的使用封装好了。在Linux操作系统下,要编译出能在ARM平台上运行的程序,必须使用交叉编译工具arm-linux-gcc、arm-linux-ld等。

一、arm-linux-gcc选项

要使一个C/C++文件变成可执行文件,需要经过如下四个步骤:预处理、编译、汇编、连接。即:

(图来源于:cnblogs.com/chaguang/p/8306106.html)

1.1 预处理

预处理就是将要包括的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i"文件中等待进一步处理。

以hello.c文件为例

预处理 gcc -E hello.c -o helle.i

上述代码中的gcc总体选项-E表示,预处理后即停止,不进行编译,预处理后的代码送往标准输出。

1.2 编译

编译就是把C/C++代码(比如上述的”.i"文件)“翻译”成为汇编代码。

编译 gcc -S hello.i -o hello.s

上述代码中的gcc总体选项-S表示,编译后即停止,不进行汇编。

1.3 汇编

汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件)

汇编 gcc -c hello.s -o hello.o

上述代码中的gcc总体选项-c表示,预处理、编译和汇编源文件,但是不作连接,编译器根据源文件生成OBJ文件。

1.4 连接

连接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件连接起来,最终生成可以在特定平台运行的可执行文件。

链接 gcc hello.o -o hello

2. 总体选项

-E表示,预处理后即停止,不进行编译,预处理后的代码送往标准输出。

-S表示,编译后即停止,不进行汇编。

-c表示,预处理、编译和汇编源文件,但是不作连接,编译器根据源文件生成OBJ文件。

-o file表示,指定输出文件为file。无论是预处理、编译、汇编还是连接,这个选项都可以用。

-v表示,显示制作GCC工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号

3. 以下列程序为例

3.1 先在终端输入:cd 桌面

再分别输入:touch main.c

                      touch sub.h

                      touch sub.c

桌面会出现三个文件:

分别在文件中输入以下代码

File:main.c

#include <stdio.h>
#include "sub.h"

int main(int argc, char *argv[])
{
    int i;
    printf("Main fun!\n");
    sub_fun();
    return 0;
}

File: sub.h

void sub_fun(void);

File: sub.c

void sub_fun(void)
{
    printf("Sub fun!\n");
}

继续在终端中输入

gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o

其中,main.o、sub.o是经过了预处理、编译、汇编后生成的OBJ文件,分别输入上述三句代码后会出现两个.o文件

因为这两个文件还不是可执行文件,所以最后一步就是将它们连接为可执行文件test,在终端输入:

./test

3.2 

输入

gcc -S -o main.s main.c

即生成main.c的汇编语言文件main.s

3.3 对main.c进行预处理,并将得到的结果打印出来

输入:gcc -E main.c

 4. 警告选项

“-Wall"选项基本打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量除了声明就没再使用等。

本文中的main.c,第六行中的i没有被使用,所以:

输入:gcc -Wall -c main.c

执行后,得到:

这个警告虽然对程序没有坏的影响,但是有些警告需要加以关注,比如匹配类型的警告等。

5. 连接器选项

用于连接OBJ文件,输出可执行文件或库文件

5.1 object-file-name

5.2 -llibrary

输入:gcc -v -o test main.o sub.o

得到:

可以看见,除了main.o、sub.o两个文件外,还连接了启动文件crt1.o、crti.o等,还有一些库文件。

5.3 -nostartfiles

不连接系统标准启动文件,而标准库文件仍然正常使用

5.4 -nostdlib

不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接库

5.5 -static

在支持动态连接的系统上阻止连接共享库。

5.6 -shared

生成一个共享OBJ文件,它可以和其他OBJ文件连接产生可执行文件。只有部分系统支持该选项。

输入:gcc -shared -o sub.a sub.o

会生成一个库文件:

6. 目录选项

posted @ 2020-07-12 21:14  菜小白king  阅读(905)  评论(0)    收藏  举报