linux 静态库的使用(linux静态库的使用)

linux

什么是库?

在windows平台和linux平台下都大量存在着库。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

本文仅限于介绍linux下的库。

2.库的种类

linux下的库有两种:静态库和共享库(动态库)。

二者的不同点在于代码被载入的时刻不同。

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

如何在macosx中创建动态链接库?

  创建动态链接库:  

1、生成module文件,也就是.o文件。这跟一般的Linux没什么区别。  cc -c a.c b.c 就得到a.o和b.o  

2、用ld来合并.o文件  ld -r -o c.o a.o b.o 这个也没什么特别。  

3、用libtool来创建动态链接库。  libtool -dynamic -o c.dylib a.o b.o ( 这里也可以用libtool -static -o c.a a.o b.o就创建静态库)  如果用gcc直接编译,linux下一般是:  gcc -shared -o c.so a.c b.c  而在Mac OS X下需要:  gcc -dynamiclib -o c.dylib a.c b.c  这往往也是向Mac OS X移植unix程序常出问题的地方。如果用autoconf/automake等工具,出错的几率应该小一些。  访问动态链接库:  1、nm是最常用的,这个用法跟linux下差不多  nm c.dylib 可以看到导出符号表,等等。  2、另一个常用的工具是otool,这个是Mac OS X独有的。比如想看看c.dylib的依赖关系  otool -L c.dylib  对Framework的理解:  Framework是Mac OS X下必不可少的部分,不妨去看看/System/Library/Frameworks/下面,一大堆Framework。Framework是dylib的进一步演化,它把头文件、文档、动态链接库等整合成一个有机的目录,类似一种自描述的方式,这种做法其实在Mac OS X下随处可见。比如应用程序,一般都是一个目录,譬如/Applications/iTunes.app目录对应应用程序iTunes,双击这个目录即开始执行。这种做法和Windows下常见的一个exe/dll打天下很不相同。  Framework的创建工具也是libtool,详细用法参考man。  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  这里介绍一下怎么开发最简单的Cocoa程序,这个程序实在是太简单,因为如果你用Xcode的话,选用Cocoa Foundation Command Tool的话,应该不用写任何代码, 但是这里是为了向大家介绍一下,这个最简单的程序是如何通过gcc编译成功的,当然里面还有一个东西可以做一点解释.    先看看源代码:  #import

LINUX下怎样加一条静态路由?

1、添加一条默认路由 route add default gw 10.0.0.1 (默认只在内存中生效) 开机自启动可以追加到/etc/rc.local文件里 echo “route add default gw 10.0.0.1” >>/etc/rc.local 2、添加一条静态路由 route add -net 192.168.2.0/24 gw 192.168.2.254 要永久生效的话要这样做: echo “any net 192.168.2.0/24 gw 192.168.2.254” >>/etc/sysconfig/static-routes 添加到一台主机的静态路由 route add -host 192.168.2.2 gw 192.168.2.254 要永久生效的话要这样做: echo “any host 192.168.2.2 gw 192.168.2.254 ” >>/etc/sysconfig/static-routes 注:Linux 默认没有这个文件 ,得手动创建一个

linux标准库是动态还是静态?

编译器的默认设置是连接动态库,这就要求在程序执行的时候需要的动态库必须存在。改变编译选项可以变为静态连接,这样生成的程序运行时不需要库的支持,但是文件的尺寸一般较大。

linx的C标准库都有,看你自己喜欢哪样用哪样。

当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。

然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

动态库和静态库的区别?

  我们通常把一些公用函数制作成函数库,供其它程序使用。  函数库分为静态库和动态库两种。  静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。  动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。  本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。  在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。  第1步:编辑得到举例的程序–hello.h、hello.c和main.c;  hello.h(见程序1)为该函数库的头文件。  hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出”Hello XXX!”。  main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。  程序1: hello.h  #ifndef HELLO_H  #define HELLO_H  void hello(const char *name);  #endif //HELLO_H  程序2: hello.c  #include   void hello(const char *name)  {  printf(“Hello %s!/n”, name);  }  程序3: main.c  #include “hello.h”  int main()  {  hello(“everyone”);  return 0;  }  第2步:将hello.c编译成.o文件;  无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。  在系统提示符下键入以下命令得到hello.o文件。  # gcc -c hello.c  #  (注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。)  (注2:首字符”#”是系统提示符,不需要键入,下文相同。)  我们运行ls命令看看是否生存了hello.o文件。  # ls  hello.c hello.h hello.o main.c  #  (注3:首字符不是”#”为系统运行结果,下文相同。)  在ls命令结果中,我们看到了hello.o文件,本步操作完成。  下面我们先来看看如何创建静态库,以及使用它。  第3步:由.o文件创建静态库;  静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。  在系统提示符下键入以下命令将创建静态库文件libmyhello.a。  # ar cr libmyhello.a hello.o  #  我们同样运行ls命令查看结果:  # ls  hello.c hello.h hello.o libmyhello.a main.c  #  ls命令结果中有libmyhello.a。  第4步:在程序中使用静态库;  静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。  在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。  # gcc -o hello main.c -L. -lmyhello  # ./hello  Hello everyone!  #  我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。  # rm libmyhello.a  rm: remove regular file `libmyhello.a’? y  # ./hello  Hello everyone!  #  程序照常运行,静态库中的公用函数已经连接到目标文件中了。  我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。  第5步:由.o文件创建动态库文件;  动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。  在系统提示符下键入以下命令得到动态库文件libmyhello.so。  # gcc -shared -fPCI -o libmyhello.so hello.o  #  我们照样使用ls命令看看动态库文件是否生成。  # ls  hello.c hello.h hello.o libmyhello.so main.c  #  第6步:在程序中使用动态库;  在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。  # gcc -o hello main.c -L. -lmyhello  # ./hello  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory  #  哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。  # mv libmyhello.so /usr/lib  # ./hello  Hello everyone!  #  成功了。这也进一步说明了动态库在程序运行时是需要的。  我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。  先删除 除.c和.h外的 所有文件,恢复成我们刚刚编辑完举例程序状态。  # rm -f hello hello.o /usr/lib/libmyhello.so  # ls  hello.c hello.h main.c  #  在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。  # gcc -c hello.c  # ar cr libmyhello.a hello.o  # gcc -shared -fPCI -o libmyhello.so hello.o  # ls  hello.c hello.h hello.o libmyhello.a libmyhello.so main.c  #  通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello。  # gcc -o hello main.c -L. -lmyhello  # ./hello  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory  #  从程序hello运行的结果中很容易知道,当静态库和动态库同名时, gcc命令将优先使用动态库。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平