静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

查看当前工程目录的内容

[root@root config-file]# tree

.

|-- Makefile

|-- Makefile.a

|-- Makefile.so

|-- configfile.c

|-- configfile.o

|-- include

|   |-- configfile.h

|   `-- our_syslog.h

|-- main.c

`-- main.o

1 directory, 9 files

[root@root config-file]# cat include/*.h

++++++++++++++++++++++++++++++++++++++++++++

int read_config_file(char *filename, char *keyword, char *value);

#define dmsg(log,format,args...) do{if(log) \

fprintf(stderr, "WARING: " format , ##args);    \

else    \

fprintf(stderr, "INFO: " format , ##args);  \

}while(0)

++++++++++++++++++++++++++++++++++++++++++++

Makefile.so生成动态链接库的makefile文件

[root@root config-file]# cat  Makefile.so

CFLAGS += -I/root/config-file/include -fPIC

DFLAGS += $(CFLAGS) -shared

all : libfile.so

libfile.so: configfile.o

$(CC) $^ -o $@ $(DFLAGS)

%.o:%.c

$(CC) $(CFLAGS) -c $< -o $@

.PHONY : clean

clean :

-rm -f libfile.so *.o

Makefile.a生成静态链接库的makefile文件

[root@root config-file]# cat  Makefile.a

CFLAGS += -I/root/config-file/include

all : libfile.a

libfile.a: configfile.o

$(AR) rcs $@ $^

%.o:%.c

$(CC) $(CFLAGS) -c $< -o $@

.PHONY : clean

clean :

-rm -f libfile.a *.o

主程序

[root@root config-file]# cat  main.c

#include <stdio.h>

#include <stdlib.h>

#include "configfile.h"

#include "our_syslog.h"

int  main()

{

char value[100]={0};

read_config_file("/root/syslog.conf", "openwrt", value);

dmsg(0,"%s\n", value);

dmsg(1,"%s\n", value);

return 0;

}

主程序的Makefile

[root@root config-file]# cat  Makefile

OBJS=configfile.o main.o

CFLAGS=-I/root/config-file/include

CFLIBS=-L/root/config-file -lfile -g -O -Wall

all:test

test: $(OBJS)

$(CC) $^ -o $@ $(CFLAGS) $(CFLIBS)

%.o:%.c

$(CC) -c $< -o $@ $(CFLAGS)

.PHONY : clean

clean :

-rm -f test *.o

生产静态库

[root@root config-file]# make -f Makefile.a

gcc -I/root/config-file/include -c configfile.c -o configfile.o

ar rcs libfile.a configfile.o

[root@root config-file]# ar -t libfile.a #查看静态库中的文件

configfile.o

连接静态库,编译主程序

[root@root config-file]# make

gcc -c configfile.c -o configfile.o -I/root/config-file/include

gcc -c main.c -o main.o -I/root/config-file/include

gcc configfile.o main.o -o test -I/root/config-file/include -L/root/config-file -lfile -g -O -Wall

[root@root config-file]# ./test

INFO: hello-openwrt

WARING: hello-openwrt

[root@root config-file]# rm libfile.a

rm:是否删除 一般文件 “libfile.a”? y

生产动态库

[root@root config-file]# make -f Makefile.so

gcc -I/root/config-file/include -fPIC -c configfile.c -o configfile.o

gcc configfile.o -o libfile.so -I/root/config-file/include -fPIC -shared

[root@root config-file]# ls

configfile.c  configfile.o  include  libfile.so  main.c  Makefile  Makefile.a  Makefile.so

连接动态库,编译主程序

[root@root config-file]# make

gcc -c configfile.c -o configfile.o -I/root/config-file/include

gcc -c main.c -o main.o -I/root/config-file/include

gcc configfile.o main.o -o test -I/root/config-file/include -L/root/config-file -lfile -g -O -Wall

[root@root config-file]# ./test

./test: error while loading shared libraries: libfile.so: cannot open shared object file: No such file or directory

这就是动态库和静态库的区别了

[root@root config-file]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/config-file

也可以放到/usr/lib下(64位系统/usr/lib64)

[root@root config-file]# ./test

INFO: hello-openwrt

WARING: hello-openwrt

使用ldd命令查看可执行文件依赖于哪些库

[root@root config-file]# ldd test

linux-gate.so.1 =>  (0x00782000)

libfile.so (0x007ae000)

libc.so.6 => /lib/libc.so.6 (0x007f4000)

/lib/ld-linux.so.2 (0x007d1000)

本文转自 Linux_woniu 51CTO博客,原文链接:http://blog.51cto.com/linuxcgi/1965301

linux下编译动态和静态链接库相关推荐

  1. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  2. Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决

    Linux下编译.链接.加载运行C++ OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C++之后(还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C++) ...

  3. Linux下的静态链接库和动态链接库

    Linux下的静态链接库和动态链接库 零.链接库概述 Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数, ...

  4. linux如何编译boost指定库,linux下编译安装boost库

    linux下编译安装boost库 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15 UTC 2015 x ...

  5. linux下运行时链接库的路径顺序

    那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻: 1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L): exampl ...

  6. linux编译pcre生成动态链接库,Linux下编译安装PCRE库

    最近在学习nginx,nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库.具体步骤如下: 1.下载PCRE包 首先去官网下载pcre的安装包 如果通过FTP的方式 ...

  7. Linux运行8086代码,* linux下编译,链接,运行,汇编程序

    当前使用的操作系统:ubuntu11.10 汇编程序由定义好的段构成,每个段都有不同的目的,三个最常用的段: 1)data 段 汇编程序data(数据)段是可选的. 数据段声明带有初始值的数据元素,这 ...

  8. linux 保存编译log,(转)Linux下编译安装log4cxx

    一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...

  9. linux php7.2编译安装,Linux下编译安装php7.2

    准备工作 所有操作需要在root用户下 安装路径: /usr/local/php 安装PHP 首先要安装如下依赖包 $ yum install -y gcc gcc-c++  make zlib zl ...

最新文章

  1. mysql哪些数据库不能删除吗_为什么我不能删除MySQL数据库?
  2. vue 高阶面试题_高级Web前端工程师面试之Vue问题汇总解析
  3. 检查 linux guest vm 使用的什么 虚拟化技术
  4. Python 工具列表
  5. Activiti实战. 1.5Activiti架构与组件
  6. 配置sql server 2000以允许远程访问
  7. 第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
  8. 自定义view imageviw
  9. ASP.Net Mvc 发布网站 (样式+图片问题)
  10. java大学实用教程(第四版)_Java大学实用教程(第4版)
  11. C# 将excel文件导入到SqlServer数据库
  12. 中国土地市场销售规模状况与投资战略研究报告2022版
  13. Periodic Strings (求HoHoHo字符串最小周期)
  14. Anaconda奇怪问题记录:WARNING conda.exceptions:print_unexpected_error_report(1251): KeyError(‘pkgs_dirs‘)
  15. postgresql中sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text
  16. Excel如何完成多权重计算
  17. 数据的导出Excel表
  18. python 类的执行中保部存值_c/c++关于内存分配的知识(非常详细的比较,且VirtualAlloc分配内直接在进程的地址空间中保留一快内存)...
  19. Chrome浏览器突然无法打开的解决方法
  20. 【2020年4月9我和小峰子的聊天】

热门文章

  1. leetcode算法题--可被三整除的最大和
  2. leetcode算法题--环绕字符串中唯一的子字符串★
  3. 正则表达式(RegularExpression)
  4. PM-Summit 2019全球产品经理大会北京站即将开幕!
  5. Retrofit 上传文件显示进度及踩坑记录
  6. Jquery基础之DOM操作
  7. ObjC block入门
  8. Jquery操作Cookie,保存商品ID值至本地文件中
  9. 解决tomcat shutdown时的地址被占用问题
  10. 内置付费 inapp purchase and Error Domain=SKErrorDomain Code=0 “Cannot connect to iTunes Store”错误...