学习啦>学习电脑>操作系统>Linux教程>

Linux静态库与动态库使用方法教程

加城分享

  Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。这篇文章主要介绍了 Linux静态库与动态库实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

  Linux静态库与动态库实例详解

  1. Linux 下静态链接库编译与使用

  首先编写如下代码:

  // main.c

  #include "test.h"

  int main(){

  test();

  return 0;

  }

  // test.h

  #include

  using namespace std;

  void test();

  // test.c

  #include "test.h"

  void test(){

  cout<< "test!" <

  }

  然后编译:

  1. gcc -c test.c //生成目标文件

  2. ar crv libtest.a test.o //生成静态链接库libtest.a

  3. g++ -o main main.c -ltest //编译main程序同时链接libtest.a静态库

  4. ./main //运行main程序

  2. Linux 下动态链接库编译与使用

  代码与上述一致。

  然后编译:

  1. g++ -fPIC -shared -o libtest.so test.c //生成动态链接库libtest.so

  2. g++ -o main main.c -ltest //调用动态链接库libtest.so

  3. ./main //运行main程序

  3. 链接时缺失了相关目标文件(.o)

  代码与上述一致。

  编译过程如下:

  1. gcc -c test.c

  2. gcc -c main.c

  3. gcc -o main main.o

  这时,你会发现,报错了:undefined reference to `test'.

  这就是最典型的 undefined reference 错误,因为在链接时发现找不到某个函数的实现文件, 本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。

  1. gcc -o main main.o test.o

  【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译

  也会报undefined reference错,其实底层原因与上面是一样的。

  gcc -o main main.c //缺少test()的实现文件

  需要改成如下形式才能成功,将test()函数的实现文件一起编译。

  gcc -o main main.c test.c //ok,没问题了

  4. 链接时缺少相关的库文件(.a/.so)

  在此,只举个静态库的例子,假设源码与上述一致。

  1. 把test.c编译成静态库:

  gcc -c test.c

  sr -rc test.a test.o

  gcc -c main.c

  2. 生成可执行程序:

  gcc -o main -main.o

  此时同样出现 undefined reference to `test'报错。其根本原因也是找不到test()函数的实现文

  件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个

  库,链接命令修改为如下形式即可。

  1. gcc -o main main.c ./test.a

  5. 多个库文件链接顺序问题

  这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论

  的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?

  1. gcc -o main main.o func.a test.a

  我们会得到如下的编译错误:

  1. test.a(test.o): In function `test':

  2. test.c:(.text+0x13): undefined reference to `func'

  3. collect2: ld returned 1 exit status

  因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库

  的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链

  补充:Linux基本命令

  1.ls命令:

  格式::ls [选项] [目录或文件]

  功能:对于目录,列出该目录下的所有子目录与文件;对于文件,列出文件名以及其他信息。

  常用选项:

  -a :列出目录下的所有文件,包括以 . 开头的隐含文件。

  -d :将目录像文件一样显示,而不是显示其他文件。

  -i :输出文件的i节点的索引信息。

  -k :以k字节的形式表示文件的大小。

  -l :列出文件的详细信息。

  -n :用数字的UID,GID代替名称。

  -F : 在每个文件名后面附上一个字符以说明该文件的类型,“*”表示可执行的普通文 件;“/”表示目录;“@”表示符号链接;“l”表示FIFOS;“=”表示套接字。

  2.cd命令

  格式:cd [目录名称]

  常用选项:

  cd .. 返回上一级目录。

  cd ../.. 将当前目录向上移动两级。

  cd - 返回最近访问目录。

  3.pwd命令

  格式: pwd

  功能:显示出当前工作目录的绝对路径。

  相关阅读:Linux主要特性

  完全兼容POSIX1.0标准

  这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

  多用户、多任务

  Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。

  良好的界面

  Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

  支持多种平台

  Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。


Linux 库相关文章:

1.linux关闭db2数据库命令

2.linux下mysql关闭数据库命令行

3.linux sqlite3命令

4.linux中的find与grep命令的区别

5.Linux系统中wc命令的用法详解

    4019276