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

  • 相关阅读:
    大型网站核心架构因素
    大型网站架构模式
    博客中的文章归档是如何实现的
    Caused by: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
    git分支开发的好处
    layui之日期和时间组件
    vue-electron脚手架
    springboot1.5.4 配置druid1.1.0(使用druid-spring-boot-starter)
    Node.js读取文件内容并返回值(非异步)
    C# ftp ListFilesOnServer
  • 原文地址:https://www.cnblogs.com/bugutian/p/4902581.html
Copyright © 2011-2022 走看看