Makefile 编译动态库文件及链接动态库

本文详细介绍了如何使用Makefile编译动态库libmytest.so,并展示了如何在两个不同场景下链接该动态库:一是在编译应用程序时加载,二是在程序运行时动态加载。同时提到了在/etc/ld.so.conf.d/添加库路径以及使用dlfcn.h动态加载函数的方法。
摘要由CSDN通过智能技术生成

文件目录结构如下

dynamiclibapp.c
Makefile
comm/inc/apue.h
comm/errorhandle.c
dynamiclib/Makefile
dynamiclib/dynamiclib_add.c
dynamiclib/dynamiclib_mul.c
dynamiclib/inc/dynamiclibs.h
dynamiclib/libs/

dynamiclib目录
dynamiclib/inc/dynamiclibs.h 文件内容如下:

#ifndef __dynamic_libs_h__
#define __dynamic_libs_h__
#include "apue.h"
int dynamic_lib_func_add(int i1, int i2);
int dynamic_lib_func_mul(int i1, int i2);
#endif

dynamiclib/dynamiclib_add.c 文件内容如下:

#include "dynamiclibs.h"

int dynamic_lib_func_add(int i1, int i2) 
 {
int iret = i1 + i2; 
printf("... in .so func, %d add %d,return %d\n", i1, i2, iret);
return iret;
 }

复制代码
dynamiclib/dynamiclib_mul.c 文件内容如下:

#include "dynamiclibs.h"
 
 int dynamic_lib_func_mul(int i1, int i2) 
{
 int iret = i1 * i2; 
printf("... in .so func, %d multiplys %d, retun %d\n", i1, i2, iret);
return iret;
 }

dynamiclib/Makefile 文件内容如下:

1 CC = gcc
2 CFLAGS = -Wall -g -O -fPIC 需要加上 -fPIC
3 CXXFLAGS =
4 INCLUDE = -I ./inc -I …/comm/inc
5 TARGET = libmytest.so
6 LIBPATH = ./libs/
7
8 vpath %.h ./inc
9
10 OBJS = dynamiclib_add.o dynamiclib_mul.o
11 SRCS = dynamiclib_add.c dynamiclib_mul.c
12
13 ( O B J S ) : (OBJS): (OBJS):

Makefile在C语言中主要用于自动化构建过程,特别是当项目较大、包含多个源文件和目标文件时,它可以帮助管理编译步骤。要编译动态链接库(通常称为.so文件),你需要在Makefile中设置以下几个关键部分: 1. **变量设定**: - `CC` 或 `CXX`: 编译器(例如 gcc 或 g++)。 - `AR` 和 `RANLIB`: 索引程序(用于创建静态库)和归档程序(用于压缩库)。 2. **规则定义**: - `SRCS` 变量列出所有需要编译的源文件。 - `OBJS` 变量基于`SRCS`生成的对应目标文件名(通常是.c或.cpp扩展名转成.o)。 - 添加一个新的规则,如 `libfoo.so: $(OBJS)`, 表示当`$(OBJS)`都存在时,将生成`libfoo.so`。 3. **编译规则**: - 使用 `$(CC)` 和 `-shared` 选项编译动态库,比如 `%.o: %.c`可以写成 `$(CC) -c -fPIC $< -o $@`. - 使用 `ar` 命令打包目标文件为静态库:`$(AR) rcs libfoo.a $(OBJS)`. - 如果需要运行链接(如有依赖的库),则添加 `$(CC) -shared -o libfoo.so $(OBJS) -Lpath/to/library -ldependency`. 4. **安装规则**: - 安装前确保清理旧版本(如果有):`clean:; rm -rf libfoo*` - 安装时将库移动到指定位置,如 `/usr/local/lib` 或 `install: clean; cp libfoo.so /your/install/path`. 例子: ```makefile CC = gcc AR = ar SRCS = source1.c source2.c source3.c OBJS = $(SRCS:.c=.o) all: libfoo.so %.o: %.c $(CC) -c -Wall -std=c99 -fPIC $< -o $@ libfoo.so: $(OBJS) $(CC) -shared -o libfoo.so $(OBJS) -lm clean: rm -rf *.o libfoo.* install: clean cp libfoo.so /usr/local/lib/ ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值