• gcc以及共享库的加载


    1.    预处理器头文件包含:
    
        gcc默认搜索头文件位置
           gcc -E prog.c -o prog.i
           cpp prog.c > prog.i
    
           默认搜索头文件路径:
           /usr/include
           /usr/local/include
    
           当使用#include 预处理指令时,
           后面的<>中填写相对于默认搜索目录的路径.
           如果使用"", 则默认先搜索当前目录, 然后
           再搜索系统目录.
    
           -I选项用来指定除默认搜索目录之外的头文件
        搜索路径.
    
    2. 预处理器定义
        简单定义:
        #define MACRO_NAME REPLACE
    
        定义"宏函数", 带参宏:
        #define MACRO_FUNC(arg1, arg2) REPLACE
    
    3. 条件编译
        #ifdef DEBUG
            ...
        #else
            ...
        #endif
    
        #ifndef XXX
            ...
        #else
            ...
        #endif
    
        #if 1
            ...
        #else
            ...
        #endif
    
        注意条件编译是在编译期编译之前处理的,
        因此它和C语言的if语句有本质的差别, 它
        不在运行时进行条件判断.
    
        gcc选项 -D可以用来预定义一个宏,
        ex:
            gcc -DDEBUG ...
        代表预定义DEBUG宏
    
    4. 库(用size命令查看可执行程序的大小)
        1) 静态库生成:
        静态库(static library, archive, 后缀.a): 
            打包好的.o档.
            打包:
            ar -crv libxxx.a 1.o 2.o ...
        当应用程序使用静态库时,
        静态库和应用程序链接在一起, 应用程序中会保存有
        静态库的副本.
        静态库的缺点:
            1. 占用空间
            2. 升级不便, 每次升级都要重新链接程序.
    
        2). 共享库生成
        共享库(shared object, dynamic linked library,
        后缀.so):
            gcc --shared -fPIC -o libxxx.so 1.c 2.c ...
        当应用程序使用共享库时,
        链接阶段应用程序需要查询函数是否定义, 但并不将
        共享库的副本保存在应用程序中. 当应用程序开始执
        行时, 操作系统会通过保留在应用程序中的相关信息
        加载相应的共享库.
        动态库/共享库的优点:
            1. 占用空间少(硬盘占用少, 内存空间占用少)
            2. 升级方便
        缺点:
            需要将其放入系统默认动态库搜索目录或者配置
            /etc/ld.so.conf才能使用, 软件发布具有依赖性.
    
    5. gcc 选项:
        -I: 指定gcc除默认目录外的头文件搜索目录.
        -L: 指定gcc除默认搜索目录外的库文件搜索目录.
            gcc默认搜索/lib 和 /usr/lib下的库文件.
        -l: 指定链接哪一个库. 例如, 要链接数学库libm.so
            那么编译时命令行上指定 -lm
    
    6. 共享库加载
        系统默认到/lib /usr/lib下加载动态库.
        否则需要配置 /etc/ld.so.conf, 加入放置动态库的
        路径, 并执行ldconfig更新动态库路径信息.
  • 相关阅读:
    Linux的Service/Daemon你真的懂了吗?
    linux下关于svn提交的时候强制写注释
    protobuf C++ 使用示例
    du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h --max-depth=1 |grep [
    USVN
    关于分布式系统的数据一致性问题
    Linux环境下SVN服务器端的安装与配置
    linux下svn服务器安装配置与启动
    HTML5 直播协议之 WebSocket 和 MSE
    CDN的实现原理
  • 原文地址:https://www.cnblogs.com/will-boot/p/3355196.html
Copyright © 2020-2023  润新知