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 即可。
linux 高级编程之库的使用的更多相关文章
- linux高级编程基础系列:线程间通信
linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...
- Linux高级编程--02.gcc和动态库
在Linux环境下,我们通常用gcc将C代码编译成可执行文件,如下就是一个简单的例子: 小实验:hello.c #include <stdlib.h> #include <stdio ...
- Linux高级编程--05.文件读写
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...
- Linux高级编程--10.Socket编程
Linux下的Socket编程大体上包括Tcp Socket.Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较 ...
- Linux高级编程--08.线程概述
线程 有的时候,我们需要在一个基础中同时运行多个控制流程.例如:一个图形界面的下载软件,在处理下载任务的同时,还必须响应界面的对任务的停止,删除等控制操作.这个时候就需要用到线程来实现并发操作. 和信 ...
- Linux高级编程--04.GDB调试程序(查看数据)
查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...
- Linux高级编程--04.GDB调试程序(设置断点)
调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程 ...
- linux高级编程——IO
1,文件IO 1)open——打开或创建一个文件 open(char *,flag,mode)在fcntl.h文件中声明. 参数: char * 包含有文件名和路径 flag 打开文件方式 mode ...
- 〖Linux〗Linux高级编程 - 进程间通信(Interprocess Communication)
[转自: http://blog.csdn.net/Paradise_for_why/article/details/5550619] 这一章就是著名的IPC,这个东西实际的作用和它的名字一样普及.例 ...
随机推荐
- 【转】IOS中各种常用控件的默认高度,很全
1.状态栏 状态栏一般高度为20像素,在打手机或者显示消息时会放大到40像素高,注意,两倍高度的状态栏在好像只能在纵向的模式下使用.如下图 用户可以隐藏状态栏,也可以将状态栏设置为灰色,黑色或者半 ...
- window平台下的MySQL快速安装。(不好意思,未完成待续,请飘过)
MySQL安装方式 MSI安装(Windows Installer) ZIP安装 最好选择ZIP安装,比较干净,也快速搞好. 下载链接:http://pan.baidu.com/s/1sjFZZul ...
- 很好的UI动效设计参考
toolBar下拉:
- Node.js(2)-protobuf zeromq gzip
1.Node.Js环境准备 在win8 + vs.net 2012 环境下调试了很长时间没搞定安装编译问题,重装系统测试了2套环境,解决了编译问题: 1)Win8.1 + vs.net 2013 2) ...
- "ORA-12154: TNS:could not resolve the connect identifier specified"的解决办法
添加环境变量解决: 变量名:TNS_ADMIN 变量值:D:\Ocl\product\11.2.0\dbhome_1\NETWORK\ADMIN tnsnames.ora所在的路径
- MySQL的replace函数的用法
REPLACE(field,find_str,replace_str): 字段field的内容中的find_str 将被 替换为 replace_str . 例如: update short_url ...
- .NET 分页
.net分页 1.存储过程create procedure 存储过程名( @pageIndex int, //第几页 @pageSize int ...
- shell 脚本关键字&符号
shell概念 "shell"既是一种解释型编程语言,也是一个这种编程语言的解释器的名字 shell是解释型语言,就是解释器会一条一条的翻译每一条语句并执行,对比之下,C语言是编译 ...
- Python开发之【用户登录锁定】
用户登录验证,输入密码错误三次,锁定此用户. 将用户信息存入文件 文件内容格式如下: {','login_flag':True} {','login_flag':True} {','login_fla ...
- 微信微博分享注意事项(sharesdk)
0.(重要)如果接入多渠道可以考虑微博微信appid appkey等信息放到服务端,方便临时修改又可避免很多渠道时替换ShareSDK.xml文件出错. 但是cocos2dx-2.x版本使用代码配置a ...