zoukankan      html  css  js  c++  java
  • 编译动态库与静态库的注意事项和方法

    一 .编译动态库:

    使用动态库的四种方法:

      1. export LD_LIBRARY_PATH=/usr/lib64/( so所在路径)

        只对当前用户的终端生效, 其他用户没用。

      2.在该 sudo vim /etc/ld.so.conf文件下; 将动态库的路径加进来;然后 sudo ldconfig -v 进行更新。(这种方法的弊           端,可能其他的操作系统没有这个配置文件)

         1)sudo vim /etc/ld.so.conf

          将(动态库的路径)加进来

        2)sudo ldconfig -v更新 动态库配置文件

      3.无论什么动态库, Linux操作系统,都是默认去该目录下 /usr/lib/查找使用的动态库;

        所以有两种办法:创建动态库的软连接至该目录;

        sudo ln -s (动态库的源文件)  /usr/lib;

        这个方法的好处:(动态库进行更新时,会把目录下的一起更新,不需要额外操作;不推荐把动态库拷贝至该目录下     因为更新时需要把该目录下的都更新)。

        sudo cp (动态库的源文件)   /usr/lib;

      4. 修改该用户下的 .bashrc 配置文件;将动态库的路径添加进来;重新执行配置文件:source .bashrc。(弊端:只              在当前用户下有用)

    二. 静态库的使用与上述方法一样;

    三. 最易忽视的步骤:

      上面方法成功后,当编译程序时,可能还会出现找不到动态库的情况。(重点,本人已经在这里吃过好几次亏了)

      此时:1. 需要在编译程序时加上  -lm -ldl ;(有时加1个就有用,加2个也没有坏处,以我目前的水平来看)

          2.同时注意:切记加上述两项时,一定要放到最末尾。原因:现在不明;

    四。奉上自己写的一段 Makefile

     1 CC=gcc
     2 CPPFLAGS= -I /home/yyx/02/openssl-1.0.1t/include/
     3 CFLAGS=-Wall -g
     4 LIBPATH = -L /usr/lib
     5 LIBS= -lssl -lcrypto -lhiredis -lm -ldl
     6 
     7 
     8 #找到当前目录下所有的.c文件
     9 src = $(wildcard ./src/*.c)
    10 
    11 #将当前目录下所有的.c  转换成.o给obj
    12 obj = $(patsubst %.c, %.o, $(src))
    13 
    14 rsa = test_rsa
    15 
    16 target = $(rsa)
    17 
    18 ALL:$(target)
    19     
    20 #生成所有的.o文件
    21 $(obj):%.o:%.c
    22     $(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) 
    23     
    24 #test_rsa程序
    25 $(rsa):./src/test.o  
    26     $(CC) $^ -o $@ $(CPPFLAGS)  $(LIBPATH) $(LIBS) $(CFLAGS)    
    27  
    28  
    29 #clean指令
    30 
    31 clean:
    32     -rm -rf $(obj) $(target) ./test/*.o
    33 
    34 #将clean目标 改成一个虚拟符号
    35 .PHONY: clean ALL

     五. 注意Linux下编译动态库的时候, 可能产生的链接问题;

      1.该问题当时产生的情况: 在同一个文件夹下, 对一份文件进行了 多次备份(每次更新时都会);  导致的情况: 一个 .h 头文件中包含的函数 会在多个文件中 都有实现;  

      -----------------------

      产生的问题:  1. 直接编译 可执行程序, 运行 .h头文件 中的各项函数实现, 没有任何问题产生.

            2.当编译动态库后, 加载到 其他程序中运行时, 此时 会出现 段错误;  原因是: 动态库中可能有 函数连接到 别的 .c 实现文件中去了, 导致出现链接不上的错误.

            此时一运行程序, 当加载到这步时, 就出现段错误....

     

  • 相关阅读:
    SpringMVC(十六) 处理模型数据之SessionAttributes
    SpringBoot_web开发-【实验】-登陆&拦截器
    SpringBoot_web开发-【实验】-国际化
    SpringBoot_web开发-【实验】-引入资源
    什么是NIO?
    SpringBoot_web开发-扩展与全面接管SpringMVC
    SpringBoot_web开发-webjars&静态资源映射规则
    SpringBoot_web开发-thymeleaf语法
    SpringBoot_web开发-引入thymeleaf
    (实例)Linux 内核添加exfat驱动
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/6115403.html
Copyright © 2011-2022 走看看