linux下编译动态和静态链接库
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
查看当前工程目录的内容
[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下编译动态和静态链接库相关推荐
- Linux下的静态链接库和动态链接库编程
Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...
- Linux下编译、链接、加载运行C++ OpenCV的两种方式及常见问题的解决
Linux下编译.链接.加载运行C++ OpenCV的两种方式及常见问题的解决 在Linux下安装完OpenCV C++之后(还没有安装的读者请参考Ubuntu 18.04 安装OpenCV C++) ...
- Linux下的静态链接库和动态链接库
Linux下的静态链接库和动态链接库 零.链接库概述 Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数, ...
- 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 ...
- linux下运行时链接库的路径顺序
那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻: 1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L): exampl ...
- linux编译pcre生成动态链接库,Linux下编译安装PCRE库
最近在学习nginx,nginx rewrite依赖于PCRE库,所以需要在linux系统中编译安装PCRE库.具体步骤如下: 1.下载PCRE包 首先去官网下载pcre的安装包 如果通过FTP的方式 ...
- Linux运行8086代码,* linux下编译,链接,运行,汇编程序
当前使用的操作系统:ubuntu11.10 汇编程序由定义好的段构成,每个段都有不同的目的,三个最常用的段: 1)data 段 汇编程序data(数据)段是可选的. 数据段声明带有初始值的数据元素,这 ...
- linux 保存编译log,(转)Linux下编译安装log4cxx
一个项目的服务器端在Linux平台下,用到了开源日志库log4cxx,这个库是apache项目的一个子库.功能很不错.下面记录下它的编译和安装过程. 第一步安装apr-1.3.8,顺序不能错,它必须首 ...
- linux php7.2编译安装,Linux下编译安装php7.2
准备工作 所有操作需要在root用户下 安装路径: /usr/local/php 安装PHP 首先要安装如下依赖包 $ yum install -y gcc gcc-c++ make zlib zl ...
最新文章
- mysql哪些数据库不能删除吗_为什么我不能删除MySQL数据库?
- vue 高阶面试题_高级Web前端工程师面试之Vue问题汇总解析
- 检查 linux guest vm 使用的什么 虚拟化技术
- Python 工具列表
- Activiti实战. 1.5Activiti架构与组件
- 配置sql server 2000以允许远程访问
- 第三方外部 Saas提供商如何跟使用 SAP 系统的客户进行对接接口集成
- 自定义view imageviw
- ASP.Net Mvc 发布网站 (样式+图片问题)
- java大学实用教程(第四版)_Java大学实用教程(第4版)
- C# 将excel文件导入到SqlServer数据库
- 中国土地市场销售规模状况与投资战略研究报告2022版
- Periodic Strings (求HoHoHo字符串最小周期)
- Anaconda奇怪问题记录:WARNING conda.exceptions:print_unexpected_error_report(1251): KeyError(‘pkgs_dirs‘)
- postgresql中sql查询语句报错处理——ERROR: failed to find conversion function from unknown to text
- Excel如何完成多权重计算
- 数据的导出Excel表
- python 类的执行中保部存值_c/c++关于内存分配的知识(非常详细的比较,且VirtualAlloc分配内直接在进程的地址空间中保留一快内存)...
- Chrome浏览器突然无法打开的解决方法
- 【2020年4月9我和小峰子的聊天】
热门文章
- leetcode算法题--可被三整除的最大和
- leetcode算法题--环绕字符串中唯一的子字符串★
- 正则表达式(RegularExpression)
- PM-Summit 2019全球产品经理大会北京站即将开幕!
- Retrofit 上传文件显示进度及踩坑记录
- Jquery基础之DOM操作
- ObjC block入门
- Jquery操作Cookie,保存商品ID值至本地文件中
- 解决tomcat shutdown时的地址被占用问题
- 内置付费 inapp purchase and Error Domain=SKErrorDomain Code=0 “Cannot connect to iTunes Store”错误...