使用GCC编译的常用功能

转自http://www.tuicool.com/articles/yMnAFb

(1)gcc对多个分立源文件的编译(-c, -o)

$ls
test.h test.c main.c
$gcc -c test.c -o test.o #生成中间文件test.o
$gcc -c main.c -o main.o #生成中间文件main.o
$gcc test.o main.o -o main #生成最终的main可执行文件

(2)gcc动态链接库的编译(-shared, -fPIC, -L)

$ls
test.h test.c main.c
$gcc -c test.c -o #生成中间文件test.o
$gcc -shared -fPIC test.o -o libtest.so #利用中间文件生成动态库
$gcc main.c -L. -ltest -o main #链接动态库生成最终的main可执行文件
#如果将libtest.so生成放入./lib/下,则
$gcc -shared -fPIC test.o -o ./lib/libtest.so #利用中间文件生成动态库
$gcc main.c -L ./lib -ltest -o main #链接动态库生成最终的main可执行文件

#注意:

-L. 表示为当前目录

-fPIC参数,作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

(3)动态链接库的使用

 1)隐式使用

#1 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
$ln -s /usr/test/lib/*.so /usr/lib
$ldconfig
#2 修改LD_LIBRARY_PATH
$export LD_LIBRARY_PATH=/usr/test/lib :$LD_LIBRARY_PATH
$ldconfig
#3 修改/etc/ld.so.conf
  #@1 使用vim添加
   $vim /etc/ld.so.conf
   #手动添加 /usr/test/lib 一行到文件中
   $ldconfig
  #@2 使用管道追加
  $echo "/usr/test/lib" >> /etc/ld.so.conf
  $ldconfig

 2)显式使用

在程序中显式调用dlopen, dlsym, dlclose系列函数(#include <dlfcn.h>)来实现,这里不详述。

(4)gcc静态库的编译和使用(-static, ar)

$ls
test.h test.c main.c
$gcc -c test.c -o #生成中间文件test.o
$ar crv libtest.a test.o #生成静态库libtest.a
a - test.o
$gcc main.c libtest.a -o main #链接静态库生成最终的main可执行文件
($gcc main.c -static -ltest -o main) #优先选择静态库
#如果将libtest.a生成放入./lib/下,则
$ar crv ./lib/libtest.a test.o #生成静态库libtest.a
a - test.o
$gcc main.c ./lib/libtest.a -o main #链接静态库生成最终的main可执行文件
($gcc main.c -L ./lib -static -ltest -o main) #优先选择静态库

#注意:

ar命令可以用来创建、修改库。

c:创建一个库。不管库是否存在,都将创建。

r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。

v:该选项用来显示执行操作选项的附加信息。

(5)编译警告选项同时将警告记录输出到文件(-Wall和2,-Werror,-pedantic)

#以程序中存在一个没有使用到的变量b为例
$ls
test.h test.c main.c
$gcc -c test.c -o test.o -Wall 2> debug.txt
c:4: warning: unused variable 'b'
$cat debug.txt
c:4: warning: unused variable 'b'
#当然如果你有代码洁癖症,可以加-Werror选项,再有警告的地方就停止编译
$gcc -Werror -c test.c -o test.o
#pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码
$gcc -pedantic -c test.c -o test.o

(6)指定头文件的路径(-I)

$gcc –c –I /usr/dev/mysql/include test.c –o test.o

(7)汇编(-E,-S)

#预处理,将头文件等内容插入到test.c中
$gcc -E test.c -o test.i($gcc -E test.c)
#生成汇编代码
$gcc -S test.i -o test.s
#通过汇编码生成目标文件
$gcc -c test.s -o test.o

(8)调式(-g)

$gcc -c test.s -o test.o

其他

gcc 命令的常用选项

选项 解释

-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,

例如 asm 或 typeof 关键词。

-c 只编译并生成目标文件。

-DMACRO 以字符串“1”定义 MACRO 宏。

-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。

-E 只运行 C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。

-lLIBRARY 连接时搜索指定的函数库LIBRARY。

-m486 针对 486 进行代码优化。

-o FILE 生成指定的输出文件。用在生成可执行文件时。

-O0 不进行优化处理。

-O 或 -O1 优化生成代码。

-O2 进一步优化。

-O3 比 -O2 更进一步优化,包括 inline 函数。

-shared 生成共享目标文件。通常用在建立共享库时。

-static 禁止使用共享连接。

-UMACRO 取消对 MACRO 宏的定义。

-w 不生成任何警告信息。

-Wall 生成所有警告信息。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值