加入收藏 | 设为首页 | 会员中心 | 我要投稿 百客网 - 百科网 (https://www.baikewang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

一文带你快速了解Linux上gcc编译器

发布时间:2022-11-10 11:27:44 所属栏目:Linux 来源:
导读:  gcc是Linux/Unix上非常强大的C语言编译器。并且如今也支持C++的编译。与VC不同,gcc是完全跨平台的。到目前为止很多工具都使用gcc作为其编译环境。使用gcc编译器,就是学习它众多的编译参数。就是用连字符-连接的
  gcc是Linux/Unix上非常强大的C语言编译器。并且如今也支持C++的编译。与VC不同,gcc是完全跨平台的。到目前为止很多工具都使用gcc作为其编译环境。使用gcc编译器,就是学习它众多的编译参数。就是用连字符-连接的参数。
 
  编译的C语言源文件
 
  直接在gcc后面加上要编译的C语言源文件
 
  //main.c
  #include
  int main(int argc, char const *argv[])
  {
  
   printf("程序猿编码\n");
   return 0;
  }
  编译输出:
 
  在这里插入图片描述
 
  gcc main.c这种默认的情况下会生成一个名为a.out的可执行文件。
 
  注意:在Linux系统下,后缀名真的不是很重要的事,甚至没有后缀名都可以。这些都没有关系,比如你写一个shell的脚本,其实加不加后缀都是可以运行的。此时后缀的目的是为了便于用户管理和区分文件而已。By the way,如果你执行./main.c,那么系统会把它也当做shell脚本来运行,根本不管什么后缀。
 
  -o选项
 
  最常用的编译选项,用于指定要生成的可执行文件的名称。例如:
 
  gcc -o main main.c
  需要体会的一点是:gcc对于参数的位置无要求!比如也可以写作。
 
  gcc main.c -o main
  唯一要注意的就是-o后面一定要紧跟要生成的可执行文件名。
 
  编译出的可执行文件,在Windows下就是exe。但Linux下,后缀名无限制。一般不指定后缀就可以了。
 
  -g选项
 
  用于给生成的可执行文件加上调试信息,只有这样才可使用gdb调试。
 
  gcc -g -o main main.c
  同样参数-g的也可写在hello.c后面。
 
  想要了解GDB调试可以参考《GDB调试入门,看这篇就够了!》
 
  -c 选项
 
  终止链接器的运行,输出文件为汇编后的目标文件*.o
 
  #include
  int main(int argc, char const *argv[])
  {
  
   printf("程序猿编码\n");
   return 0;
  }
  编译输出:
 
  想要知道生成可执行程序过程为成哪四个步骤《参考GCC编译过程(预处理->编译->汇编->链接)》
 
  -O2 选项
 
  对源码进行优化,使编译出的程序,运行效率更高。注意是大写的英语字母O,不是阿拉伯数字0
 
  gcc -O2 main.c -o main
  O是Optimize之意。同样还有O1,但是优化效果不如O2,缺省是O0
 
  -D 选项
 
  给编译的源文件传递一个宏。
 
  gcc main.c -DHELLO -DWORLD=10
  相当于:
 
  //在main.c中定义了
  # define HELLO
  # define WORLD 10
  -E 选项
 
  gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。
 
  静态链接库
 
  静态链接库是后缀名为.a的文件。它有多个后缀为你.o的目标文件组成。使用-c参数可以使编译在链接前终止,所以生成的是源文件对应的目标文件。
 
  gcc -c test1.c test2.c
  ar rcs libvector.a test1.o test2.o
  ar是archive档案的缩写。上面命令生成了.a的静态库文件,在链接时linux编译器,要如下:
 
  gcc -c main.c
  gcc -static -o p2 main.o ./libvector.a
  编译静态库时先使用-rcs选项,再利用ar工具产生,然后把一些文件可重定位文件打包在一起。静态库的介绍请《参考gcc 静态库制作之ar命令使用》
 
  动态链接库
 
  后缀名为.so的是动态共享链接库文件,其中的s就是shared共享的意思,如下命令:
 
  gcc -shared -fPIC -o libvector.so test1.c test2.c
  gcc -o p2 main.c ./libvector.so
  完成了生成.so以及链接.so的操作。-fPIC指示生成与位置无关的代码。
 
  -l 选项
 
  -lm选项,在编译时会进入系统库路径搜索,链接“数学库”。常用的库会自动链接,无需指定。
 
  系统缺省的库路径为:/lib、/usr/lib、/usr/local/lib、/usr/lib64。
 
  来看看个例子,将二进制转换为十进制的程序:
 
  #include
  #include
  int binaryToDecimal(long binarynum){
      int decimalnum = 0, temp = 0, remainder;
      while (binarynum!=0){
          remainder = binarynum % 10;
          binarynum = binarynum / 10;
          decimalnum = decimalnum + remainder*pow(2,temp);
          temp++;
      }
      return decimalnum;
  }
  int main(int argc, char const *argv[])
  {
      long binarynum;
      printf("Enter a binary number: ");
      scanf("%ld", &binarynum);
      printf("Equivalent decimal number is: %d", binaryToDecimal(binarynum));
      printf("\n");
      return 0;
  }
  编译输出:
 
  在这里插入图片描述
 
  在这个程序中,我们创建了一个用户定义的函数binaryToDecimal(),用于二进制到十进制的转换。该程序将二进制数(由用户输入)作为输入,并使用函数将其转换为十进制数。
 
  在程序中,有带有数学函数 pow,通过 man手册打开pow库函数。则会看到需要连接 -lm选项。
 
  在这里插入图片描述
 
  -L选项
 
  如果该库不在系统缺省路径下(比如第三方库,自定义的库),还要使用**-L**选项指定路径。
 
  -L/home/share/mylib
  使用c99标准编译
 
  如果想让编译器以c99编译可以使用:
 
  gcc -std=c99 main.c
  包含非系统的头文件
 
  -I选项指定头文件的位置。一般和L选项联用。比如:
 
  gcc mysql_test.c -I /usr/local/include/mysql -L/usr/local/lib -lmysqlclient -o test
  -M检查所需的头文件
 
  gcc -M main.c
  以makefile风格显示源文件的依赖关系。会列出所有包含的所有头文件。会列出标准库的头文件。
 
  如果不想显示标准库的头文件,请使用 -MM 选项代替 -M。
 
 
 

(编辑:百客网 - 百科网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!