zoukankan      html  css  js  c++  java
  • 待整理-静态库和动态库

    在Linux下工作了几年,都是一些环境较成熟的产品,无需自己搭建makefile,新增文件只要在makefile里面加入XXX.cc就行了,对静态库与动态库的理解也只是概念上的。新公司里的makefile简直是团mess,甚至编译都通不过,只得自己去整理makefile,顺便研究了下静态库与动态库。
    1.       静态库
    静态库是将编译出来的.o文件打包成libXXX.a的格式,使用静态库时通过-L指定路径,-lXXX引用库。相信libXXX.a是g++默认的搜索命名方式。静态库是在链接阶段被引入的,运行阶段不需要库的存在,但编译阶段需要头文件的存在,否则出现未声明错误。即编译(头文件)+链接(库文件)+运行(什么也不需要)。如果不想使用静态库,能找到编译出来的.o的话,直接使用.o也行,连-L, -l都省了,如g++ -o main main.cc XXX.o。
    2.       动态库
    动态库有二种使用方式(之前我以为只有一种dlopen的方式)。
    第一种方式是编译时使用动态库,要使用-L与-l。也是将编译出来的.o(与编译静态库的.o不一样,这里要加-fpic选项)打包成libXXX.so。这种方式在编译时看不出使用的动态库还是静态库。编译(头文件)+链接(库文件)+运行(库文件)。
    第二种方式是在代码中通过dlopen使用动态库,编译+链接+运行(库文件)。这种方式在编译时无需知道动态库的任何信息,但编程者要知道库文件的函数原型(库文件的函数还要extern “C”,否则在运行时,dlsym会报找不到函数的错误,可能dlopen函数族是对C设计的,不支持C++)。

    实例:
    生成".o"文件
    1106 gcc -c hello.c -fPIC -I ./

    生成静态库".a"
    1087 ar cr libmyhello.a hello.o
    1092 g++ -o hello main.cpp -L. -lmyhello -I ./

    动态库".so"
    1107 g++ -shared -fPCI -o libmyhello.so hello.o
    1108 g++ -o hello main.cpp -L. -lmyhello -I ./
    1110 export LD_LIBRARY_PATH=./
    1111 ./hello

    动态库执行
    export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
    ./hello

  • 相关阅读:
    css3 实现水平或垂直布局
    css div 细边框
    css scroll bug
    F和弦大横按
    简单分析beyond作曲
    [编织消息框架][设计协议]优化long,int转换
    nginx 限制ip
    nginx注册成服务
    nginx 添加win 服务
    sqlserver 使用维护计划备份
  • 原文地址:https://www.cnblogs.com/bugutian/p/4902581.html
Copyright © 2011-2022 走看看