gcc(库)
时间:2010-08-19 来源:liuminpeng2000
一。概要
使用第三方库
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 <stdio.h>
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 <stdio.h>
#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步是完全相同的
使用第三方库
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 <stdio.h>
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 <stdio.h>
#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步是完全相同的
相关阅读 更多 +