作者shininglion (lionking - 辛巴)
看板NCTU_CS_EDA
标题建立静态或动态函式库
时间Thu Feb 9 20:38:30 2012
如果有想要建立自己的 share library 的话可以参考一下
作者 float (鹏羽) 站内 P-float
标题 建立 动态、静态函式库
时间 2011/11/10 Thu 16:43:27
reference:
http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch09.htm
reference里面比较详细
简介:
函式库(library)是一些事先编译过的函数集合
Linux中标准的系统函数库通常放在目录/lib和/usr/lib,函式库的名称都是以lib开头,
再加上自定的名称,附属档名为.a或.so。名称加上.a的函式库代表这是一个静态的函式
库,名称加上.so的函式库代表这是一个动态的函式库。
静态函式库 libXXXX.a
动态函式库 libXXXX.so
特性
静态函式库:执行时不需要函式库,但档案较大
动态函式库:执行档小
更改程式可以不用重新编译其他程式
甚至可以在执行时修改
动态函式库命名
real name: libXXXX.so.版本代号1.版本代号2....
linker name: 编译器所搜寻的程式库名称,
传统上就是real name删去所有版本号码後的名称,
例如「libXXXX.so」
使用函式库
拿数学函式库举例我们在使用的时候会下像这样的指令
gcc main.c -o main -lm
-lm 就是告诉linker我们要link m这个函式库
而m这个函式库的实际档案名称是 libm.a (静态)
接下来用下面三个档案来示范制作动态和静态函式库
==========main.c==========
#include "my_lib.h"
int main()
{
my_printf("abc");
return 0;
}
==========================
==========my_lib.h========
#ifndef __MY_LIB_H__
#define __MY_LIB_H__
#include <stdio.h>
int my_printf(const char* str);
#endif
==========================
==========my_lib.c========
#include "my_lib.h"
int my_printf(const char* str)
{
return printf(str);
}
==========================
以上当案可以先用
gcc main.c my_lib.c -o main 编译来测试正确性
接下来第一步将要编成函式库的档案编译但不要link
gcc -c my_lib.c
-c 参数就是编译但不连结
执行完後会产生 my_lib.o
这时候一样可以这样编译
gcc main.c my_lib.o -o main
如果懒得继续把档案编成什麽函式库是可以这样用就好XD
静态函式库
接下来使用ar指令来产生静态函式库
ar -cru libmy_lib.a my_lib.o
其中参数-cru 用来建立或加入目的档案,c建立静态函数库,r告知ar取代已经存在的目
的档案,u表示取代的目的档案必须比现存的目的档案还新。
这样就可以产出 libmy_lib.a 这个静态函式库
接下来就可以这样使用编译好的函式库
gcc main.c -o main -lmy_lib (视情况加上 -L函式库位置让编译器搜寻的到函式库)
执行 ./main
动态函式库
第一步也是将要编成函式库的档案编译
gcc -fPIC -c my_lib.c 一样产生my_lib.o
加上fPIC的用意好像是让他在记忆体中只有一份可以省空间,这我还要研究一下
不加也是可以完成後面的步骤
在来使用-shared来让gcc建立动态函式库
gcc -shared my_lib.o -o libmy_lib.so
就可得到 libmy_lib.so 这个动态函式库
在来使用方法同上
gcc main.c -o main -lmy_lib (视情况加上 -L函式库位置让编译器搜寻的到函式库)
这时候执行./main应该会发现类似以下错误
./main: error while loading shared libraries: libmy_lib.so: cannot open
shared object file: No such file or directory
这是因为 libmy_lib.so 并不是放在PATH所包含的路径下,
把它搬过去或是在PATH里面加入你想要的位置就可以解决这个问题了
以上 请多指教
还有我发现那个网页好像很多地方打错字= =
==补充==
刚刚自己在实做的时候想到一个问题,如果目录下同时有动态和静态函式库那要gcc会选
哪个? 答案是先选动态,如果希望使用静态的函式库请加上 -static 参数
--
╔═══╗ ╦ ╔═══╗ ╔═══╗ ╔═╦═╗
║ ║ ║ ║ ║ ║ ║
╠══╣ ║ ║ ║ ╠═══╣ ║
║ ║ ║ ║ ║ ║ ║
╩ ╩═══╝ ╚═══╝ ╩ ╩ ╩
--
※ Origin: 成功大学资讯工程学系[醉资心BBS] <goodguy.csie.ncku.edu.tw>
◆ From: 140.116.111.93
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.134.61
1F:推 dnol:实用! 太感谢了! 这篇应该要收 02/10 00:23