zoukankan      html  css  js  c++  java
  • C++学习笔记23:库

    静态库(Archives)

    • 后缀一般为“*.a”
    • 使用两个目标文件创建单一静态库的编译与链接命令:ar cr libtest.a  test1.o test2.o
    • 链接器搜索静态库时,链接所有已引用而未处理的符号
    • 将静态库的链接放置在命令行尾部,确保其引用被正确解析

    动态库(Shared Object)

    • 共享目标库(类似windows的DLL),后缀一般为“*.so”
    • 编译命令:g++ -shared - fPIC -o libtest.so test1.o test2.o
    • PIC:位置无关代码(Position - Independent Code)
    • 译器首先链接动态库,其次才是静态库
    • 如果要强制链接静态库,编译使用-static选项

    标准库与库相关性

    C标准库:libc

    数学库单独:libm;需要调用数学函数时,显式链接数学库:g++ -o compute compute.c -lm

    C++标准库:libstdc++

    编译C++11程序,使用g++ -4.8 -std=c++11 ;对于Code::Blocks等集成开发环境,在编译器设置对话框中选用C++11选项

    库的相关性

    • 链接时需要注意交叉引用被正确解析,例如:libtiff库需要libjpeg库(jpeg图像处理)和libz库(压缩处理)
    • 独立库链接:g++ -static -o tifftest tifftest.c -ltiff -ljpeg -lz
    • 相关库链接:g++ -o app app.o -la -lb -la(库之间交叉相关)

    动态库的装载与卸载

    动态库装载dlopen():头文件:“dlfcn.h”

    函数查找与装载函数dlsym()

    动态库卸载函数:dlclose()

    动态库错误处理函数dlerror()

    调用动态库中的函数,设函数名为g

    混合c/c++编码时,c函数应该封装extern "C"{...}块中,确保名解析正确工作(c不支持函数重载)

    链接选项:“-ldl”

    void *handle = dlopen("libtest.so",RTLD_LAZY);

    //声明函数指针指向动态库中的函数,按被调函数的名称查找

    void (*test)() = dlsym(handle,"g");

    (*test)();//使用函数指针调用动态库中的函数

    dlclose(handle);

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    1-素材库同步:将素材组的素材同步到oss
    MongoDB_2:mongodb高级聚合查询
    关于python:如果键存在,则删除字典项
    Kafka学习-分布式日志系统 / 消息队列
    摘要算法—md5简介
    mac使用pyenv安装和管理多个python版本
    如何mac电脑上查看安装了几个python?
    mac os-Homebrew的安装及使用
    第一次博客
    个人介绍
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6235103.html
Copyright © 2011-2022 走看看