静态库,动态库简单制作

Centos7系统

一. 静态库

  1. 名称 : libxxxx.a, xxxx是该lib的名称
  2. 特点 : 编译过程中已经被载入可执行程序, 因此体积较大
  3. Makefile :
    #Makefile
    CC := gcc
    AR := ar
    
    all:
    	$(CC) -c lpm.c -o lpm.o -Wall -Werror
    	$(AR) cr liblpm.a lpm.o
    	#-L 指定库的路径 -l 指定需连接的库名
    	#-Wl,-Bstatic指示跟在后面的-lxxx选项链接的都是静态库 
    	#-Wl,-Bdynamic指示跟在后面的-lxxx选项链接的都是动态库
    	$(CC) main.c -o main -L. -Wl,-Bstatic -llpm -Wl,-Bdynamic -Wall -Werror
    
    clean:
    	rm main *.o *.a
    

二. 动态库(共享库)

  1. 名称 : libxxxx.so.major.minor, xxxx是该lib的名称, major是主版本号, minor是副版本号
  2. 特点 : 可执行程序运行时才载入内存的, 在编译过程中仅简单的引用, 因此代码体积较小
  3. 动态库路径设置 :
    (1) 把库拷贝到/usr/libxxxx目录下
    (2) 在LD_LIBRARY_PATH环境变量中加上库所在路径. 例如,
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/demo/liblpm.so
    
    (3) 修改/etc/ld.so.conf文件, 把库所在的路径加到文件末尾, 并执行ldconfig刷新
  4. Makefile :
    #Makefile
    CC := gcc
    
    all:
    	$(CC) -fPIC -shared lpm.c -o liblpm.so -Wall -Werror
    	#-L 指定库的路径 -l 指定需连接的库名
    	#-Wl,-Bstatic指示跟在后面的-lxxx选项链接的都是静态库 
    	#-Wl,-Bdynamic指示跟在后面的-lxxx选项链接的都是动态库
    	$(CC) main.c -o main -L. -Wl,-Bdynamic -llpm -Wall -Werror
    
    clean:
    	rm main *.o *.so
    

三. tip

  1. 当静态库和动态库同名时, gcc命令将优先使用动态库
  2. nm命令 : 打印出库中的涉及到的所有符号
  3. ldd命令 : 查看一个可执行程序依赖的共享库
  4. strip命令 : 精简可执行程序, 以及库(删除相关符号信息和调试信息)
#include "lpm.h"

int main(int argc, char **argv){

    lpm_print("hello world!");

    return 0;
}
#ifndef LPM_H
#define LPM_H

void lpm_print(const char *str);

#endif //LPM_H
#include <stdio.h>

void lpm_print(const char *str){

    if(str != NULL)
        printf("LPM %s\n", str);
    else
        printf("str is Null!");
}

原创文章 14 获赞 18 访问量 2030

猜你喜欢

转载自blog.csdn.net/lpaim/article/details/105959102