Linux系统平台下关于GCC编译及使用的方法

;编译: 第一步、是进行预编译 , 使用-E参数可以让GCC在预处理结束后停止编译过程: gcc -E hello.c -o hello.i 预处理的宏定义插入到hello.i中 第二步、是将hello.i编译为目标代码 , 这可以通过使用-c参数来完成: gcc -c hello.i -o hello.o 也可以通过源文件直接生成 gcc -c hello.c 第三步、是将生成的目标文件链接成可执行文件: gcc hello.o -o hello 也可以通过源文件直接生成 gcc -o hello hello.c 警告: 1、-pedantic 选项 , 那么使用了扩展语法的地方将产生相应的警告信息 2、-Wall 使用它能够使GCC产生尽可能多的警告信息 3、-Werror , 它要求GCC将所有的警告当成错误进行处理 库依赖: 1、Linux下的大多数函数都默认: 头文件放到/usr/include/目录下 而库文件则放到/usr/lib/目录下 2、GCC在编译时必须有自己的办法来查找所需要的头文件和库文件 。-I选项可以向GCC的头文件搜索路径中添加新的目录 。例如 , 如果在/home/xiaowp/include/目录下有编译时所需要的头文件 , 为了让GCC能够顺利地找到它们 , 就可以使用-I选项: gcc -o test test.c -I /home/xiaowp/include -L选项向GCC的库文件搜索路径中添加新的目录 例如 , 如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so , 为了让GCC能够顺利地找到它 , 可以使用下面的命令 gcc -o test test.c -L /home/xiaowp/lib -lfoo 值得好好解释一下的是-l选项 , 它指示GCC去连接库文件libfoo.so 。Linux下的库文件在命名时有一个约定 , 那就是应该以lib三个字母开头 , 由于所有的库文件都遵循了同样的规范 , 因此在用-l选项指定链接的库文件名时可以省去lib三个字母 , 也就是说GCC在对-lfoo进行处理时 , 会自动去链接名为libfoo.so的文件 。-static选项 , 强制使用静态链接库 如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so和libfoo.a 为了让GCC在链接时只用到静态链接库 , 可以使用下面的命令: gcc -o test test.c -L /home/xiaowp/lib -static -lfoo 选项-O可以告诉GCC同时减小代码的长度和执行时间 , 其效果等价于-O1 。在这一级别上能够进行的优化类型虽然取决于目标处理器 , 但一般都会包括线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化 。选项-O2告诉GCC除了完成所有-O1级别的优化之外 , 同时还要进行一些额外的调整工作 , 如处理器指令调度等 。选项-O3则除了完成所有-O2级别的优化之外 , 还包括循环展开和其它一些与处理器特性相关的优化工作 。通常来说 , 数字越大优化的等级越高 , 同时也就意味着程序的运行速度越快 。许多Linux程序员都喜欢使用-O2选项 , 因为它在优化长度、编译时间和代码大小之间 , 取得了一个比较理想的平衡点 。time ./test 查看程序执行时间 优化虽然能够给程序带来更好的执行性能 , 但在如下一些场合中应该避免优化代码: 程序开发的时候优化等级越高 , 消耗在编译上的时间就越长 , 因此在开发的时候最好不要使用优化选项 , 只有到软件发行或开发结束的时候 , 才考虑对最终生成的代码进行优化 。资源受限的时候一些优化选项会增加可执行代码的体积 , 如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备) , 那就不要对代码进行优化 , 因为由这带来的负面影响可能会产生非常严重的后果 。跟踪调试的时候在对代码进行优化的时候 , 某些代码可能会被删除或改写 , 或者为了取得更佳的性能而进行重组 , 从而使跟踪和调试变得异常困难 。加速: 使用管道代替编译中临时文件, -pipe 加速编译 gcc -pipe foo.c -o foo GCC常用选项 -c 通知GCC取消链接步骤 , 即编译源码并在最后生成目标文件; -Dmacro 定义指定的宏 , 使它能够通过源码中的#ifdef进行检验; -E 不经过编译预处理程序的输出而输送至标准输出; -g3 获得有关调试程序的详细信息 , 它不能与-o选项联合使用; -Idirectory 在包含文件搜索路径的起点处添加指定目录; -llibrary 提示链接程序在创建最终可执行文件时包含指定的库; -O、-O2、-O3 将优化状态打开 , 该选项不能与-g选项联合使用; -S 要求编译程序生成来自源代码的汇编程序输出; -v 启动所有警报; -Wall 在发生警报时取消编译操作 , 即将警报看作是错误; -Werror 在发生警报时取消编译操作 , 即把报警当作是错误; -w 禁止所有的报警 。

推荐阅读