zoukankan      html  css  js  c++  java
  • gcc

    gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点。现在很多程序员都应用GCC,怎样才能更好的应用GCC。目前,GCC可以用来编译C/C++、FORTRAN、JAVA、OBJC、ADA等语言的程序,可根据需要选择安装支持的语言。

    语法

    gcc(选项)(参数)

    选项

    -o:指定生成的输出文件;
    -E:仅执行编译预处理;
    -S:将C代码转换为汇编代码;
    -wall:显示警告信息;
    -c:仅执行编译操作,不进行连接操作。
    -g:-g标志是对程序进行调试性编译时常用的选项。
    -I:指定头文件路径(相对路径或绝对路径,建议相对路径)
    -L:指定连接的动态库或者静态库路径(相对路径或绝对路径,建议相对路径)
    -l:指定需要链接的库的名字(链接libc.a :-lc  libc.so : -lc   注意:-l后面直接添加库名省区“lib”和“.so”或“.a”  )

    参数

    C源文件:指定C语言源代码文件。

    实例

    gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

    上面这句表示在编译hello.c时:

    -I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/includ

    -L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

     -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

     gcc -l(小写L)参数和-L参数

    -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

    好 了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib 里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配 套的头文件)

    放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目 录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr /X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L /aaa/bbb/ccc -ltest

    另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,

    如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so

    手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如

    gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头 文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果

    现 在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。

    常用编译命令选项

    假设源程序文件名为test.c

    无选项编译链接

    gcc test.c

    将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

    选项 -g

    默认编译生成的可执行文件是无法使用 gdb 来跟踪或调试的,因为可执行程序中没有可供 gdb 调试使用的特殊信息,为了将必要的调试信息整合到可执行文件中,我们便需要用到 -g 选项,这样生成的可执行程序,倘若出现问题,便可以使用 gdb 找出问题具体出现的位置,便于问题的解决。

    加上-g选项以后,gcc在编译是会做以下额外的操作:

    1. 创建符号表,符号表包含了程序中使用的变量名称的列表。

    2. 关闭所有的优化机制,以便程序执行过程中严格按照原来的C代码进行。

    选项 -o

    gcc test.c -o test

    将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

    选项 -E

    gcc -E test.c -o test.i

    将test.c预处理输出test.i文件。

    选项 -S

    gcc -S test.i

    将预处理输出文件test.i汇编成test.s文件。

    选项 -c

    gcc -c test.s

    将汇编输出文件test.s编译输出test.o文件。

    无选项链接

    gcc test.o -o test

    将编译输出文件test.o链接成最终可执行文件test。

    选项 -O

    gcc -O1 test.c -o test

    使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

    多源文件的编译方法

    如果有多个源文件,基本上有两种编译方法:

    假设有两个源文件为test.c和testfun.c

    多个文件一起编译

    gcc testfun.c test.c -o test

    将testfun.c和test.c分别编译后链接成test可执行文件。

    分别编译各个源文件,之后对编译后输出的目标文件链接。

    gcc -c testfun.c    #将testfun.c编译成testfun.o
    gcc -c test.c       #将test.c编译成test.o
    gcc -o testfun.o test.o -o test    #将testfun.o和test.o链接成test

    以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

  • 相关阅读:
    swift把颜色转成图片
    第四篇:断路器(Hystrix)
    第三篇: 服务消费者(Feign)
    第二篇:服务消费者(RestTemplate+ribbon)
    第一篇:服务的注册与发现Eureka(Finchley版本)
    递归打印目录层次(java版)
    zuul熔断代码
    Window安装Erlang环境
    移动一根火柴使等式成立js版本(递归)
    mysql 存储过程 游标嵌套
  • 原文地址:https://www.cnblogs.com/wsw-seu/p/9510109.html
Copyright © 2011-2022 走看看