gcc的基本用法

linux下gcc的基本用法

gcc 是 GUN Compiler Collection的缩写,可以支持多种语言编译,比如 C,C++,Java, pascal 等

gcc的编译过程

  • 预处理(pre-processing)E:插入头文件,替换宏
  • 编译(Compiling)S:编译成汇编
  • 汇编(Assembling) c:编译成目标文件
  • 链接 (Linking):链接到库中,变成可执行文件

gcc -E hello.c -o hello.i

gcc -S hello.i –o hello.s

gcc –c hello.s –o hello.o

gcc hello.s –o hello 链接,生成可执行文件

/hello 运行

也可以一次性完成:

gcc hello.c –o hello

但一般情况下生成.o文件比较好,可以重定位文件,让别人使用

gcc常用选项

选项名作用
o 生成目标
c 取消链接步骤,编译源码并最后生成目标文件
E 只运行C预编译器(头文件,宏等展开)
S 生成汇编语言文件后停止编译(.s文件)
Wall 打开编译告警(所有)
g 嵌入调试信息,方便gdb调试
llib 链接 lib 库 (这里是小写 L ) 相当于 C++ #pragma comment(lib, “xxx.lib”)
Idir 增加 include 目录 (这里是大写 i ) 头文件路径
LDir 增加 lib 目录 (编译静态库和动态库)

多模块编译

  • 一次性编译:

    gcc -Wall fun.c main_fun.c –o main_fun

  • 独立编译:

    gcc –Wall –c main_fun.c –o main_fun.o

    gcc –Wall –c fun.c –o fun.o

    gcc –Wall main_fun.o fun.o –o main_fun

多模块编译中如果某一个模块发生了变化,只需要编译更改的模块即可

静态库与共享库(动态库)

静态库(.a)

程序在编译链接时候把库的代码链接到可执行文件中。程序运行时候,不再需要静态库,生成的可执行文件大,每个可执行文件都会加载一份拷贝到内存

  • 静态库生成(libxxx.a)

    首先生成.o文件,然后通过.o文件生成.a文件

    例如:

    gcc –c fun.c

    ar rcs libfun.a fun.o

  • 静态库使用

    gcc –Wall main.c libfun.a –o main

    gcc –Wall –L. main.c –o main –lfun

    -L.表示在当前目录搜索 libfun.a

  • 静态库搜索路径

    1:编译使用选项 –L 指定的目录(建议)

    2:修改环境变量,搜索指定的目录 设置环境变量 LIBRARY_PATH

    export LIBRARY_PATH=“库目录

    3:lib文件放入系统指定目录,例如/usr/lib/等

共享库(.so或.sa)

程序运行时候才去链接共享库代码,多个程序共享使用,使用时候只需要加载一份到内存

直接可以通过.c文件生成.so文件

例如:gcc –shared –fPIC fun.o –o libFun.so

shared:生成共享库格式

fPIC: 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址

使用: gcc –Wall main.o –o main –L. -lFun

只需要-l+文件名即可

配置方式

1:拷贝到so文件到共享库目录 /usr/lib/

2:更改 LD_LIBRARY_PATH,如果已经有了一个这样的目录,要写成export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:“库目录”这样子 如果写在profile配置文件里 export LD_LIBRARY_PA TH="目录:$LD_LIBRARY_PATH"

3:配置 /etc/ld.so.conf; 并使用 ldconfig 命令进行更新

posted @ 2018-01-17 21:25  菜鸟也有高飞的时候  阅读(25338)  评论(0编辑  收藏  举报