gcc编译器

文章目录

    • gcc编译器环境下常见的文件扩展名
    • -o : 链接生成可执行文件
    • -O:设定优化级别
    • -g 产生符号调试工具gdb所必要的符号信息
    • -I : 指定程序中用到的头文件所在的目录
    • -E : 预处理结果
    • -S : 输出汇编代码文件
    • -c : 只进行编译,不进行链接
    • 动态函数库和静态函数库
      • 静态函数库
      • 动态函数库
      • 常见报错解决

gcc编译器环境下常见的文件扩展名

.c :C源程序
.s :汇编语言代码
.h:头文件
.a:函数库
.o:目标代码

-o : 链接生成可执行文件

-o 后可以指定编译生成的可执行程序名称
gcc编译器_第1张图片

-O:设定优化级别

gcc编译器_第2张图片

-g 产生符号调试工具gdb所必要的符号信息

想要调试代码,必须在编译时加入该选项
gcc编译器_第3张图片
gcc编译器_第4张图片
源代码的编译:GCC
gcc编译器_第5张图片

gcc编译器_第6张图片
gcc编译器_第7张图片

-I : 指定程序中用到的头文件所在的目录

错误信息:undefined reference to
可能的错误原因:①有部分源代码未参与编译 ②某些函数所在的函数库没有参与链接
ld return 1:return 1 表示ld程序报错,ld是程序上的链接器,此处报错原因是hello2main中调用了hello2function,但却没有把函数的定义包括进来
gcc编译器_第8张图片
解决方法:将定义被调用的函数的源代码文件(hello2function.c)和hello2main.c同时编译
注意:不要把头文件(.h)写入gcc命令行,gcc只是对源代码进行编译,不需要对.h文件进行编译
gcc编译器_第9张图片
如果将头文件放入inc目录中,编译又会报错
错误信息:头文件不存在,no such file or directory
gcc编译器_第10张图片
错误原因:include 后面是 “”,表示在编译时提供的目录中寻找头文件(include <>表示在系统的include目录里寻找头文件),如果没有提供目录,就会在双引号所指的路径寻找头文件,此处只是指明了头文件名字hello2function.h,就会在源代码文件同一个目录下寻找该头文件,而现在头文件被放到了inc目录下,因此编译报错
gcc编译器_第11张图片
解决方法代码的含义是当头文件在当前目录下找不到时,去“-I”下的目录里找,注意:-I与目录之间没有空格,此处的路径 “./inc” 为相对路径,也可以是绝对路径“/home/kaseihi/hello2/inc”
gcc编译器_第12张图片

-E : 预处理结果

此处被重定向到某个文件中
gcc编译器_第13张图片

-S : 输出汇编代码文件

汇编代码文件是后缀名为.s的文件,该命令会生成一个与源文件同名的.s后缀的文件
gcc编译器_第14张图片
gcc编译器_第15张图片

-c : 只进行编译,不进行链接

gcc编译器_第16张图片
gcc -c 将源代码文件编译成.o文件
-c 选项输出的是源文件同名的.o后缀文件
gcc -o 将helloworld.o文件完成链接生成可执行文件
gcc编译器_第17张图片
ldd命令:显示程序链接的动态函数库的名字
在这里插入图片描述
生成可执行文件的过程:
gcc编译器_第18张图片

动态函数库和静态函数库

gcc编译器_第19张图片
静态函数库: libxxx.a
动态函数库: libxxx.so
gcc编译器_第20张图片

静态函数库

gcc编译器_第21张图片

gcc -c hello2function.c  #用gcc命令对代码文件进行编译,-c选项只编译不链接
ar rv libfilename.a hello2function.o #通过ar工具将目标文件打包成.a静态库文件

打包命令 ar rv +名.a +.o文件
r: replace 用新的.o文件替换.a静态函数库中已有的同名.o文件,如果没有就直接添加
v :让ar命令在执行的过程中尽可能的打印出详细的情况信息
静态函数库文件名必须以lib开头
gcc编译器_第22张图片

gcc -o hello2 hello2main.o libhello2function.a 
#或者
gcc -o hello2 hello2main.o -L -lhello2function 
#-l后面是去掉前面lib和后面.a的静态库名称

gcc编译器_第23张图片

动态函数库

gcc编译器_第24张图片

gcc -fPIC -c example.c
gcc -shared example.o -o libexample.so

常见报错解决

调用:-L -l
运行时找不到动态函数库而报错

  • 方法1:
    修改动态函数库的搜索路径: LD_LIBRARY_PATH
export  LD_LIBRARY_PATH='pwd'   #pwd代表用户当前所在的目录
echo  $ LD_LIBRARY_PATH
ldd ./hello2   #列出动态库依赖关系
  • 方法2:
    修改系统配置文件 etc/ld.so.conf
    再运行命令 ldconfig(仅限root) 更新ld.so.cache
    libc:C语言库函数

当链接目录下同时有同名的静态函数库和动态函数库时,如何验证 -L -l 链接的是动态函数库还是静态函数库:
ldd ./hello2,看是否有.so文件,如果有,就是动态函数库(默认情况下是和动态函数库相链接)
gcc --static -o hello2 hello2main.o -L -lhello2function
传递长选项 --static,程序中的所有函数都与静态函数库链接
gcc编译器_第25张图片gcc编译器_第26张图片

你可能感兴趣的:(Linux,linux,c语言)