zoukankan      html  css  js  c++  java
  • Linux下 静态链接库 和 动态链接库

      先来说说C/C++编译过程

    1.   编译: 检查语句符号定义,将C/C++代码翻译生成中间语言。
    2.   链接: 将中间代码整合,生成可执行的二进制代码。

      简单的说,库文件都是一种特殊的中间语言文件,静态库还是一种特殊格式的归档文件(打包的文件)。

      使用静态库:

      1. 先编写库函数

     1 #ifndef _PRINT_TEST_H_
     2 
     3 #define _PRINT_TEST_H_
     4 #ifdef __cplusplus
     5 extern "C"
     6 {
     7 #endif
     8     
     9     extern int test_a;
    10     extern void print_test();
    11     extern void print_data_a();
    12 
    13 #ifdef __cplusplus
    14 }
    15 #endif
    16 
    17 #endif 
    print_test.h
     1 #ifdef __cplusplus
     2 extern "C"
     3 {
     4 #endif
     5 
     6 #include <stdio.h>
     7 
     8 void print_test()
     9 {
    10         printf("print_test
    ");
    11 }
    12 
    13 int test_a = 0;
    14 void print_data_a()
    15 {
    16         printf("data in libtest test_a = %d
    ", test_a++);
    17 }
    18 
    19 
    20 #ifdef __cplusplus
    21 }
    22 #endif
    print_test.c

     2. 主函数文件

     1 #include "print_test.h"
     2 
     3 int main()
     4 {
     5     print_test();
     6     print_data_a();
     7     print_data_a();
     8     print_data_a();
     9     print_data_a();
    10     print_data_a();
    11     return 0;
    12 }
    main.c

     3. 编译库函数

     4. 打包库

     5. 编译主函数和运行

    tips: 静态库文件命名通常以lib开头,链接库时直接 -l库名

     静态库的优点在于一次编译生成目标(main)后,这个目标是一个独立的二进制文件,而不用考虑其运行环境。

    使用动态库

    1. 编译库

         ps: 很奇怪一点是,dltest.so被赋予了可执行权限。

    2. 编译主函数

    tips: 最好将自己要用的动态链接放到系统默认的库目录下,否则运行目录没有相应的库文件会报错。

    动态库优点在于,生成的目标更小;当库文件更新时,只要原来用到的符号地址不变,目标可以继续运行,并且伴随着库一起更新。这样动态库的更新可以与目标的更新相互独立进行。

  • 相关阅读:
    程序员推荐书籍汇总
    mysql优化之表建设
    curl_setopt用此函数设置上传文件请求的兼容性调整
    VIM使用总结
    HDU3709 Balanced Number (数位dp)
    POJ2796 单调队列
    HDU 4870 Rating (2014 Multi-University Training Contest 1)
    HDU 4869 Turn the pokers (2014 Multi-University Training Contest 1)
    HDU 4864 (2014 Multi-University Training Contest 1 )
    Go Deeper(2010成都现场赛题)(2-sat)
  • 原文地址:https://www.cnblogs.com/karlvin/p/3822313.html
Copyright © 2011-2022 走看看