Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44599
  • 博文数量: 9
  • 博客积分: 465
  • 博客等级: 下士
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-11 15:07
文章分类

全部博文(9)

文章存档

2011年(2)

2010年(7)

我的朋友
最近访客

分类: C/C++

2010-08-19 11:44:31

一。概要
  使用第三方库
             1 在Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要
                借助一个或多个函数库的支持才能够完成相 的功能。
             2 从程序员的角 看,函数库实际上就是一些头文件(.h)和库文件(.so或者.a)的集合。
                虽然Linux下的大多数函数都默认将头文件放到/usr/include/ 目录下,而库文件则放到
                /usr/lib/ 目录下,但并不是所有的情况都是这样。正因如此,GCC在编译时必须有自己的
                办法来查找所需要的头文件和库文件。
             3 GCC采用搜索目录的办法来查找所需要的文件,-I选项可以向GCC的头文件搜索路径中
                添加新的目录。例如,如果在/home/hxy/upgrade/include/ 目录下有编译时所需要的头文
                件,为了让GCC能够顺利地找到它们,就可以使用-I选项:
                 gcc foo.c -I /home/xiaowp/include -o foo
             4 在一个gcc命令中可以用多个– I
 
静态库在链接时会把库目标代码与最终的可执行程序一起链接到一个文件, 这样相对尺寸较大. 但处理简单
动态库是可执行程序在运行, 动态加载到进程内存中去.  动态库与可执行程序是分离的两部分文件
Windows  下的静态库是以lib  为后缀名的文件,  而动态库是以DLL  为后缀名的文件.
Linux  下的静态链接库以.a  为后缀名 ,动态链接库是.so  为后缀名。
linux一般把系统库放在/lib下
 
 
二 注意要点及例子
(1)库命名:lib + 文件名 + .so/.a   = lib*.so或者lib*.a
(2)库的分类:1.静态库。2.动态库(又分为隐式lib*.so,显示lib*dl.so)
(3)ar:用于建立,修改,提取档案文件(archive),通常用来把gcc编译的目标文件(*.o)合在一个静态库中.
      参数使用最多的是 ar rv/rcv
(4)gcc -l(小写L)参数的使用:
目标:链接库标准表达式方式
命名:-l* ,表示链接 lib*.so
      若有动态版和静态版,会优先链接动态版,
      如果有 -static -l*,则表示强制链接静态库
(5)gcc -L(大写L)参数的使用
目标:-L参数指明从那个一目录加载库,链接时使用。
      例如 -L/home/.../lib
(6)gcc -I(大写i)参数的使用
目的:为了让gcc找到头文件,编译时使用。
(7)-I. -L.  小数点表示本目录
(8)-fpic:使输出的对象模块是按照可重定位地址方式生成的。
(9)-sharred:表示是动态链接库

例子:
文件一:hello.h
******************************************************************************
#ifndef  __HELLO_H__
#define  __HELLO_H__
extern void print_num();
#endif   /*__HELLO_H__*/
******************************************************************************
文件二:hello.c
******************************************************************************
#include
void print_num()
{
 int i;
 for(i = 1; i < 101; i++)
 {
  printf("%d\t",i);
  if(i%10 == 0)
   printf("\n");
 }
}
******************************************************************************
文件三:hello_main.c
******************************************************************************
#include
#include "hello.h"
int main()
{
 print_num();
 return 0;
}
******************************************************************************
创建静态库:
(1)把函数库编译成目标文件
 gcc -c hello.c
(2)把需要的目标文件合成静态库lib*.a
 ar rv libhello.a hello.o
(3)编译主函数成目标文件,带头文件(-I)
 gcc -c hello_main.c -I.
(4)链接时加入库目录(-L.)及静态库名(-l*),链接成一个完整的应用程序
 gcc hello_main.o -L. -lhello -o main
 
创建动态库:
(1)编译成目标文件,带上(-fpic),
 gcc -c -fpic hello.c
(2)把需要的目标文件合并成动态库lib*.so,带上(-shared),表示是动态链接库。so(shared object)
 gcc -shared hello.o -o libhello.so
(3)编译主函数成目标文件,带头文件(-I)
 gcc -c hello_main.c -I.
(4)链接时加入库目录(-L.)及动态库名(-l*),链接成一个完整的应用程序
 gcc hello_main.o -L. -lhello -o main
(5)运行,隐式调用动态方法
 export   LD_LIBRARY_PATH=$PWD;./main

注:动静态创建的第3,4步是完全相同的
阅读(1153) | 评论(0) | 转发(0) |
0

上一篇:gcc

下一篇:makefile 上

给主人留下些什么吧!~~