linux 高级编程之库的使用

静态库: .a .lib

动态库: .so .dll

差别(静态库中的代码在链接时就已经复制到可执行文件中,执行时不再依赖库,不会自动使用升级后的库,需要重新产生可执行文件。

动态库代码不在可执行文件中,执行时自动加载,库升级后,可执行文件会自动执行时会自动使用库。还有就是代码量的大小)

ar -r libstr.a string.o i2str.o 打包

?

总结:

静态库:

产生库:写若干个c文件(函数或者全局变量,不应该有main),编译(gcc -c ),打包成库(ar -r libxxxx.a 若干个.o ),写一个.h文件(函数或者全局变量的声明)

*多文件:把一个.c 切成多个,#include每个文件里一份,为每个.c写一个.h,存放.c文件中的函数和全局变量的声明。

产生可执行文件:写c程序,#include 库的头文件,可以使用库里面的函数和变量。gcc xxx.c libxxx.a ,或者 gcc xxx.c -lxxx -L库文件所在目录,或者 设置环境变量LIBRARY_PATH=库文件所在目录,从而省略前者的-L选项。

执行可执行文件:直接执行可执行文件。

需要的是 xxx.h 和 libxxx.a 不再需要源码。

?

动态库:

产生库:写若干xxx.c文件, gcc -c xxx.c 文件; gcc -fpic -shared -o libxxx.so xxx.o 文件。写一个.h文件。

产生可执行文件:写c程序,#include 库的头文件, gcc -c xxx.c ; gcc xxx.o -lxxxx -L库文件目录或者设置环境变量。

执行可执行文件:先把库文件 libxxx.so复制到 /lib 或者 /usr/lib 中或者 设置环境变量 LD_LIBRARY_PATH=$LD_LIBRARY_PATH,然后执行 ./a.out 即可。如果想永久有效,可以放到 ~/.bashrc 当中,或者放到 /etc/profile 中。

?

升级库: 把产生库的过程重复一遍。如果是动态库,可执行文件自动更新,如果是静态库,需要重复产生可执行文件的过程。新的可执行文件使用的才是新库。

静态库的使用:

下面给出了3种方法:

1、

首先定义 string.c and i2str.c

分别如下:

i2str.c

string.c

然后,编写 头文件 str.h(就是一些函数的声明)

2、打包

编译 string.c 和 i2str.c

gcc -c string.c

gcc -c i2str.c

然后会分别输出 string.o and i2str.o

再然后就是打包工作了。

ar -r libstr.a string.o i2str.o

?

3、打完包之后,就可以使用了

编写usestr.c 程序

对于用户编写的库文件,需要加上 #include "xxxx"

?

4、编译,链接即可。

提供三种方法,可供使用。但不论哪种方法,usestr.c 务必与str.h在一起才行。因为二者之间有依赖关系。

这就是动态库与静态库的差别所在,一般静态库在编译的时候,就把代码加载到程序当中了,而动态库是程序正式运行的时候才去加载文件的。

1)gcc usestr.c -lstr libstr.a 头文件与依赖库同时列出

2)gcc usestr.c -lstr -L. 从当前目录中查找依赖库

gcc usestr.c -lstr -Lmdir 从mdir文件当中查找依赖库,此时 libstr.a 需要放在mdir文件夹中。

3)export LIBRARY_PATH=mdir

gcc usestr.c -lstr 设置环境变量,然后程序会自动的从LIBRARY_PATH中查找静态库。

其中lxxx 表示要链接的libxxx.a 库文件,xxx为库名。-L. 表示在当前目录下找库文件libxxx.a

具体的过程如下面所示:

?

动态库的使用:

1)产生库

gcc -c -fpic xxx1.c xxx2.c

gcc -shared -o libxxx.so xxx1.o xxx2.o

2) 使用

编译时: 编写c程序usexxx.c

方式一:gcc -c usexxx.c ; gcc usexxx.o -lxxx -L.

方式二:gcc -c usexxx.c; gcc usexxx.o -lxxx

+ 设置环境变量 LIBRARY_PATH.

运行时:

方式一:把库文件放到系统标准库目录/usr/lib或者/lib 目录中,就可以运行a.out了。

方式二:设置环境变量LD_LIBRARY_PATH的值为动态库文件所在的目录,然后运行a.out。

?

注意一点:绝对路径没有.点开头,只有相对路径才有。

关键代码:

gcc -c welcome.c

gcc -shared -o libwelcome.so welcome.o

gcc -c usewel.c

gcc usewel.o -lwelcome -L.

cp libwelcome.so /usr/lib 后面的/可有可无

或者

LD_LIBRARY_PATH = $LD_LIBRARY_PATH : .

然后运行 ./a.out 即可。

?

时间: 2024-10-26 02:53:51

linux 高级编程之库的使用的相关文章

Linux——高级编程之概要

1.为什么要学习Linux下的高级编程 应用课程的学习,不知道Linux内核的强大功能 Linux下的高级编程课程学习:感知到内核的存在,内核的强大功能 文件管理 进程管理 设备管理 内存管理 网络管理 2.怎么样学习Linux下的高级编程 Linux下高级编程的特点:涉及到内核向用户空间提供的接口(函数) 3.为什么内核要提供这些接口呢 主要原因: A:内核要为应用程序服务,应用程序如果没有内核服务,则功能非常单一 B:内核是一个稳定的代码,同时也要为多个用户空间的程序服务,为了防止用户空间的

Linux高级编程--02.gcc和动态库

在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio.h> void main(void) { printf("hello world!\r\n"); } 可以通过如下指令来编译出一个可执行文件: gcc hello.c 执行完该命令后,就会得到一个a.out的可执行文件. 编译的过程 前面的例子只是简单的介绍了一下gcc的使用方法,

Linux高级编程--05.文件读写

缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.fseek, 另一套则是POSIX定义的系统API:open.close.read.write.seek. 其中POSIX定义的API是系统API,而C标准API是基于系统API的封装,并且提供了额外的缓冲的功能.因此也可以把它们叫做缓冲I/O函数和非缓冲I/O函数. 除了前面介绍的这几个缓冲IO函数

〖Linux〗Linux高级编程 - 进程间通信(Interprocess Communication)

[转自: http://blog.csdn.net/Paradise_for_why/article/details/5550619] 这一章就是著名的IPC,这个东西实际的作用和它的名字一样普及.例如我们浏览网页,打印文章,等等. IPC总共有五种类型: 共享内存(Shared Memory):最容易理解的一种,就像一个特工把情报放在特定地点(内存),另一个特工再过来取走一样. 内存映射(Mapped Memory):和共享内存几乎相同,除了特工们把地点从内存改成了文件系统. 管道(Pipes

Linux高级编程--04.GDB调试程序(查看数据)

查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用GDB命令来查看当前的栈中的信息. 下面是一些查看函数调用栈信息的GDB命令: backtrace / bt :打印当前的函数调用栈的所有信息.如: (gdb) bt #0 func (n=250) at tst.c:6 #1 0x08048524 in main (argc=1, argv=0xbffff6

Linux高级编程--01.vi命令

VI是Linux/Unix下标配的一个纯字符界面的文本编辑器.由于不支持鼠标功能,也没有图形界面,相关的操作都要通过键盘指令来完成,需要记忆大量命令.因此很多人不大喜欢它,但同时由于键盘的方式往往比鼠标来得快,一旦熟练后用起来是有种非常流畅的感觉的,也有人因此而非常喜欢它. 不管你喜欢也好,不喜欢也好,VI是Linux的标配编辑器,很多时候你也只有这一个编辑器可用,如果要做一个Linux Coder,熟悉VI还是非常有必要的. PS:由于VI的命令非常多,本文主要只介绍一些基础命令.并且就算是这

Linux高级编程--04.GDB调试程序(设置断点)

调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID.并用detach来取消挂接的进程. 暂停 / 恢复程序运行 调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行.你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等.以便于你查看运行时的变量,以及运行时的流程. 当进程被gdb停住时,你可以使用info pr

Linux高级编程--10.Socket编程

Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较多的,而Raw Socket则用得相对较少,不在本文介绍范围之列. TCP Socket 基于TCP协议的客户端/服务器程序的一般流程一般如下: 它基本上可以分为三个部分: 一.建立连接: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听

linux高级编程补充知识

F: 计算机系统结构: ------------------------------- 应用程序 ----------------- |  库函数 ------------------------------- 系统调用 ------------------------------- 虚拟文件系统  |    进程模块 -(文件模块)-|   进程间通信 设备文件     | ------------------------------- 硬 件 ------------------------