Windows系统和Linux系统中的静态链接库与动态链接库(三)

      本文主要讲述在Linux系统中的静态链接库与动态链接库。

      1.Linux系统中的静态链接库
      (1)创建头文件static_lib.h和源文件static_lib.c,以及应用静态库的主程序文件main.c,代码分别如下(与前面Windwos系统那篇代码基本一样):

     /*static_lib.h*/ #ifndef _STATIC_LIB_H #define _STATIC_LIB_H /* 导入或是导出的函数声明 */ void test_static_lib_method(void); #endif

/*static_lib.c 静态链接库对外提供的函数*/ #include <stdio.h> /*通过该宏定义来将头文件的函数声明为导出函数*/ #include "static_lib.h" void test_static_lib_method(void) { printf("test static library method./n"); }

/*main.c*/ #include <stdio.h> #include "static_lib.h" int main() { printf("Hello, World./n"); /*(1)测试静态态链接库的方法*/ test_static_lib_method(); getchar(); return 0; }

      (2)输入命令下面的命令,即可生成static_lib.o的文件,其中"#"是系统提示符。
          # gcc -c static_lib.c
      (3)由static_lib.o生成静态库文件,静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。创建命令为cr,其中-c 为创建的意思,-r 为在库中插入模块(替换)。
         # ar -c -r libstatic_lib.a static_lib.o
      (4)在程序中使用静态库,即将静态库中的函数添加到程序中。命令如下,其中 -L 指定静态函数库的位置,L后面还有'.'表示在当前目录下查找静态函数库,-l 则指定了静态函数库的名称,静态函数库的命名方式是lib***.a,那么可以忽略lib和.a。
         # gcc -o main main.c -L. -lstatic_lib
      (5)运行主程序,成功。
         # ./main

      2.Linux系统中的动态链接库

      2.1 创建动态链接库

      (1)创建头文件dynamic_lib.h和源文件dynamic_lib.c, 以及应用动态库的主程序文件main.c

/*dynamic_lib.h*/ void test_dynamic_lib_method(void);

 

/*dynamic_lib.c*/ #include <stdio.h> #include "dynamic_lib.h" void test_dynamic_lib_method(void) { printf("test dynamic library method./n"); }

/*main.c*/ #include <stdio.h> #include "dynamic_lib.h" int main() { printf("Hello, World./n"); /*(1)测试动态链接库的方法*/ test_dynamic_lib_method(); getchar(); return 0; }

      (2)生成dynamic_lib.o的文件
           # gcc -c dynamic_lib.c
      (3)创建动态库
           #  gcc -shared -fPCI -o libdynamic_lib.so dynamic_lib.o
      (4)动态库的使用与静态库的方法是一样的,如果使用静态库和使用动态库编译成目标程序时使用的gcc命令完全一样,则优先使用动态库。
           # gcc -o main main.c -L. -ldynamic_lib
      (5)运行主程序,报错,原因没有找到动态库。
           # ./main

      2.2 如何找到生成的动态库有3种方式[1]:
      (1)把动态库拷贝到/usr/lib或是/lib目录下。
      (2)将动态库的路径加入到LD_LIBRARY_PATH环境变量中。例如动态库libdynamic_lib.so 在/root/example/目录下:
      $export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/example/
      (3)编辑/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig命令刷新,该命令会重建/etc/ld.so.cache文件,加入的目录下的所有库文件都可见。

      2.3  查看可执行程序依赖的库的命令:
      命令:dd,举例如下
       #ldd ./main
        linux-gate.so.1 =>  (0x0086c000)
        libdynamic_lib.so => /usr/lib/libdynamic_lib.so (0x00de2000)
        libc.so.6 => /lib/libc.so.6 (0x00496000)
        /lib/ld-linux.so.2 (0x00478000)

      2.4 库文件的命名规范
     在Linux系统,库文件一般放在/usr/lib或者/lib牡蛎下,静态库的名字一般为libxxxx.a,其中xxxx是该lib的名称,动态库

的名字一般为libxxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号。

      2.5 nm命令的用法
nm命令比较简单而且强大,它用来列出一个目标文件中的各种符号,符号的种类很多,其中就包括函数名。用下面的命令可以看到

最后一行就是库的函数名。
#nm libdynamic_lib.so

 

 

[1]http://www.examda.com/linux/fudao/20100903/143434381.html

你可能感兴趣的:(linux,windows,gcc,测试,Path,library)