• 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);

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    django 模板继承
    redis集群环境配置
    压力测试工具:apache bench(ab)
    php yield关键字以及协程的实现
    php图片木马实现原理
    关于接口幂等性
    关于easyswoole实现websocket聊天室的步骤解析
    php混淆加密解密实战
    关于mysql集群主从服务器搭建
    mysql binlog恢复数据实战
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6235103.html
Copyright © 2020-2023  润新知