gcc基本用法

有一篇不错的文章:https://www.jianshu.com/p/e28e17823065
Gcc官网的讲解:https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Invoking-GCC.html#Invoking-GCC

参考链接:https://www.cnblogs.com/fnlingnzb-learner/p/8059251.html

动态库

生成动态库:
1.创建hello.so动态库
hello.c

#include   
void hello(){  
    printf("hello world\n");  
}  

hello.h

void hello();  

编译:gcc -fPIC -shared hello.c -o libhello.so

2、编译链接把libhello.so复制到/usr/lib64/系统路径下,编译main.c,使用libhello.so动态库:gcc -o main main.c -L/usr/lib64/ -lhello
或者在编译main.c,并链接libhello.so的时候,直接指定使用当前目录下的libhello.so文件:gcc -o main main.c libhello.so。

#include   
#include "hello.h"  
  
int main(){  
    printf("call hello()");  
    hello();  
}  

编译:gcc main.c -L. -lhello -o main
$$注意:生成的动态库的名字必须是lib+名字.so,之后可以直接使用-ltest来引用动态库。

静态库(还是上面的源码)

1.编译静态库hello.o:
gcc hello.c -o hello.o #这里没有使用-shared

2.把目标文档归档
ar -r libhello.a hello.o #这里的ar相当于tar的作用,将多个目标打包。
程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。

3.链接静态库
gcc main.c -lhello -L. -static -o main #加static好像会出错。我在centos7上爆错了。
这里的-static选项是告诉编译器,hello是静态库。
或者:
gcc main.c libhello.a -L. -o main
这样就可以不用加-static

依赖:

库目录
-Ldir 
制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。
头文件目录

-Idir
在你是用 #include "file" 的时候, gcc/g++ 会先在当前目录查找你所制定的头文件, 如果没有找到, 他回到默认的头文件目录找, 如果使用 -I 制定了目录,他会先在你所制定的目录查找, 然后再按常规的顺序去找。
对于 #include, gcc/g++ 会到 -I 制定的目录查找, 查找不到, 然后将到系统的默认的头文件目录查找 。

-llibrary
制定编译的时候使用的库

gcc -lcurses hello.c

编译、链接

-O0 、-O1 、-O2 、-O3
编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。
-static 
此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行。
-share
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。
-Wa,option
此选项传递 option 给汇编程序; 如果 option 中间有逗号, 就将 option 分成多个选项, 然 后传递给会汇编程序。
-Wl.option
此选项传递 option 给连接程序; 如果 option 中间有逗号, 就将 option 分成多个选项, 然 后传递给会连接程序。
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
-E
只激活预处理,这个不生成文件, 你需要把它重定向到一个输出文件里面。
-o
制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out
-pipe
使用管道代替编译中临时文件, 在使用非 gnu 汇编工具的时候, 可能有些问题。
-static
此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行。
-share
此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。

调试信息

-g
只是编译器,在编译的时候,产生调试信息。
-ggdb
此选项将尽可能的生成 gdb 的可以使用的调试信息。
-gstabs
此选项以 stabs 格式声称调试信息, 但是不包括 gdb 调试信息。
-gstabs+
此选项以 stabs 格式声称调试信息, 并且包含仅供 gdb 使用的额外调试信息。

你可能感兴趣的:(gcc基本用法)