Chinaunix首页 | 论坛 | 博客
  • 博客访问: 113395
  • 博文数量: 45
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2014-09-22 18:55
文章存档

2015年(45)

我的朋友

分类: C/C++

2015-10-26 10:46:54

linux开发工具之gcc
   gcc(GNU C Compiler)是一个可移植的编译器,支持多种硬件平台,gcc不仅仅是一个本地的编译器,而且还可以跨平台使用。gcc有多种语言前端,用于解析不同的语言。
   一.gcc编译过程:
    gcc编译过程包括:预处理(Pre-Processing),编译(Compiling),汇编(Assembling),链接(Linking).
   
选项名     作用
-o     产生目标(.i、.s、.o、可执行文件等)
-c     通知gcc取消链接步骤,即编译源码并在最后生成目标文件
-E     只运行C预编译器
-S     告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s
-Wall     使gcc对源文件的代码有问题的地方发出警告
-Idir     将dir目录加入搜索头文件的目录路径
-Ldir     将dir目录加入搜索库的目录路径
-llib     链接lib库
-g     在目标文件中嵌入调试信息,以便gdb之类的调试程序调试
例子:
gcc -E hello.c -o hello.i(预处理)
gcc -S hello.i -o hello.s(编译)
gcc -c hello.s -o hello.o(汇编)
gcc hello.o -o hello(链接)
gcc hello.c -o hello(直接编译链接成可执行目标文件)
gcc -c hello.c或gcc -c hello.c -o hello.o(编译生成可重定位目标文件)
   二.使用外部库
   
在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。
    库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显示情况的函数(ncurses库)和数据库访问例程(dbm库)等。
   头文件与库文件位置
/usr/include及其子目录底下的include文件夹
/usr/local/include及其子目录底下的include文件夹 
/usr/lib
/usr/local/lib
   gcc -Wall calc.c -o calc -lm   :-lm表示要链接libm.so或者libm.a库文件
   静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
   共享库( .so或.sa ):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。
    生成静态库:
hello_fn.h
hello_fn.c
main.c
gcc -Wall hello_fn.c -o hello_fn.o
ar rcs libhello.a hello_fn.o 
ar是gnu归档工具,rcs表示(replace and create)
gcc -Wall main.c libhello.a -o main
gcc -Wall -L. main.c -o main -lhello
(C_INCLUDE_PATH、LIBRARY_PATH  从左到右搜索-I -L指定的目录。由环境变量指定的目录。由系统指定的目录

   生成动态库:
shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
库名规则:libxxx.so
示例:gcc -shared -fPIC hello.o –o libhello.so
    使用共享库
编译选项
l:链接共享库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
示例:
gcc main.o -o main –L. -lhello
   运行共享库
1、拷贝.so文件到系统共享库路径下 一般指/usr/lib
2、更改LD_LIBRARY_PATH
3、ldconfig 配置ld.so.conf,ldconfig更新ld.so.cache





阅读(1075) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~