C文件的头文件及调用函数位置及gcc使用
C文件的头文件及调用函数位置及gcc使用
C文件示例
#include<stdio.h>//头文件的作用?
int main(int argc,char * *argv[])
{
if(argc > 2){
printf(“HELLO, %s!\n”,argv[1]);//调用函数在哪里?
} else {
printf(“HELLO, WORLD\n”);
}
Return 0;
}
C文件的解析
1.头文件
头文件的路径:stdio.h的路径,使用#include宏定义,包含要找的文件路径。
该文件在交叉编译器目录中,找到该文件,使用指令:find -name “stdio.h”(编译器默认的路径)
指定的头文件路径:
编译时 加上 -I <头文件路径>
2.调用函数
调用的函数在哪里调用?
默认的库文件默认路径:在交叉编译器的目录,使用指令:find -name lib
这个路径是库文件路径。
如何指定的库文件路径?
编译时 -L <库文件路径>,用来库目录
编译时 -Iabc 这样的选项,用来指定库文件libabc.so文件。
Gcc大概使用
一个c文件如何被gcc使用。
一个c文件需要经过预处理(preprocessing),编译(compilation),汇编(assembly),链接(linking)。流程如下:
图 1 文件处理流程
例子:
gcc -E -o hello.i hello.c //预处理步骤,生成.i文件
gcc -S -o hello.s hello.i //编译步骤,生成.s文件
gcc -c -o hello.o hello.s //汇编步骤,生成.o文件
gcc -o hello hello.o //链接步骤 生成可执行文件。
链接到库文件中的函数,链接包括两种:静态链接 动态连接。
Gcc编译选项
常用选项 |
描述 |
-E |
预处理,开发过程中想快速确定某个宏可以使用“-E -dM” |
-c |
把预处理、编译、汇编都做了,但是不链接 |
-o |
指定输出文件 |
-I(大写i) |
指定头文件目录 |
-L |
指定链接时库文件目录 |
-l(小写l) |
指定链接哪一个库文件 |
链接及动态库文件制作
gcc -c -o main.o main.c
gcc -c -o inc.o inc.c
gcc -shared -o libinc.so inc.o//生成动态链接库
gcc -o test main.o -linc -L/ //libinc.so所在目录
静态链接库文件
gcc -c -o main.o main.c
gcc -c -o inc.o inc.c
ar crs libinc.a inc.o //生成静态链接库
gcc -o test main.o libinc.a //指定静态文件的路径
gcc 警告选项
-Wall :打开警告开关,在编译的过程中,将编译的警报信息全部显示:
举例:gcc -Wall -o main main.c
gcc 链接器选项
链接器的使用情况,-llibrary
查看gcc编译过程
gcc -v -o test main.o inc.o
-v选项,显示整个编译过程
-nostartfiles
不链接系统标准启动文件,而标准库文件仍然使用:
gcc -v -nostartfiles -o test main.o inc.o
这样生成的文件无法执行
-nostdlib
不链接系统标准启动文件和标准库文件,只把指定的文件传递给链接器。
这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。
gcc -v -nostdlib -o test main.o sub.o
在编译bootloader,内核时,用到的很多函数是自包含。
-static
静态链接,生成静态可执行文件:
gcc -o test_static main.o sub.o –static
静态生成文件的大小小于动态链接生成的文件数量
-shared
默认是动态链接,可以使用这些编译,生成链接库文件。
举例:
gcc -c -o sub.o sub.c // 动态链接
gcc -shared -o libsub.so sub.o // 生成动态链接库
gcc 目录选项
-Idir :在编译的时候,指定头文件的文件目录路径。
-Ldir :指定库文件的目录路径。