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

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

  • 相关阅读:
    MIFARE Classic S50技术详解
    windown 使用python 自动切换网络
    CPU封装技术介绍
    openssl unicode编译以及VC++2015环境下的问题
    重新开启此博
    Mifare简介
    python全栈(中国历史天气可视化系统)
    cnblog优化指南
    Mysql日志详解
    scrapy抓取所有网站域名
  • 原文地址:https://www.cnblogs.com/karlvin/p/3822313.html
Copyright © 2011-2022 走看看