跳到主内容

gcc 常用实例

前言

GCC (the GNU Compiler Collection) 是由GNU组织开发的编译器套件, 可以执行预处理,编译,汇编和链接动作. 这篇文章首先向大家介绍如何生成C语言的可执行文件, 共享库(动态库) 以及静态库, 然后介绍一下gcc常用的选项.

例子

  1. 以下的例子都在Ubuntu13.10 上使用gcc 4.8.1 测试通过. 假设有三个文件

    • main.c 定义main函数

    • a.c 定义add 函数

    • b.c 定义sub 函数

  2. 可执行文件

    gcc -o test main.c a.c b.c

  3. 共享库

    • 生成共享库

      gcc -shared -o libmymath.so a.c b.c

    • 使用共享库

      gcc -o test main.c -L. -lmymath

  4. 静态库

    • 生成静态库
      1. gcc -c a.c b.c

      2. ar crv libmymath.a a.o b.o

    • 使用静态库

      gcc -o test main.c -static -L. -lmymath

    • 注意: 当ld的搜索默认搜索路径即包含共享库又包含静态库时, 默认选择链接共享库;若需要链接静态库, 则需要加上-static选项

选项

  1. -I(大写的i) 添加路径到预处理器的搜索目录

    • 使用方法 -IPATH

      • gcc -I. -o test main.c a.c b.c

      • gcc -I/home/tony/work/myheaer -o test main.c

    • 注意: 在搜索头文件时, 通过-I添加的目录会优先与系统默认的搜索目录

  2. -D 预定义宏
    • 使用方法 -DNAME

      • gcc -DCONFIG_GATE -o test main.c

        等同于: #define CONFIG_GATE=1

      • gcc -DCONFIG_GATE_VALUE=128 -o test main.c

        等同于: #define CONFIG_GATE_VALU=128

  3. -c 执行编译和汇编, 但不执行链接动作, 生成中间文件

    • gcc -c main.c a.c b.c

    • 生成 main.o, a.o, b.o

    • gcc -c main.s a.s b.s

    • 生成 main.o, a.o, b.o

  4. -S 执行编译动作, 但不执行汇编, 生成汇编文件, 通常文件后缀为.s

    • gcc -S main.c a.c b.c

    • 生成 main.s, a.s, b.s

  5. -L 添加路径到链接器的搜索目录

    gcc -o test main.c -L.

  6. -l(小写的L) 在指定的library中查找符号表

    gcc -o test main.c -L. -lmypath

  7. -Wall 打开所有的编译警告

    gcc -Wall -o test main.c

  8. -static 优先选择链接静态库

    gcc -o test main.c -static -L. -lmymath

  9. -shared 生成的目标为共享库

    gcc -shared -o libmymath.so a.c b.c

  10. -o 指定生成目标的名字

  11. -Wl 传递参数给链接器

    • gcc -o test main.c -Wl,-Map=out.map -L. -lmymath

    • gcc -o test main.c -Wl,-rpath=/media/code/exercise/gcc -L. -lmymath

  12. rpath 的作用是添加目录到运行时共享库搜索路径

  13. -g 生成debugging信息, 在使用debug工具比如GCB的时候需要

    gcc -g -o test main.c a.c .bc

结束语

虽然gcc是一个非常强大的工具, 但当一个工程比较庞大是, 直接使用gcc是不明智的选择.

  • 对于中等规模的工程,使用makefile来管理是一个不错的选择

  • 但对于非常庞大的工程, 比如KDE, 可以使用更高阶的管理工具, 比如 CMake , automake 以及 Scons

评论