我们在做一个C/C++项目的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护。我们可以把他们制作成相应的功能函数,使用时直接调用就会很方便,还可以进行后期的功能升级。 这就是动态库,当然也包括静态库。今天聊聊动态库的生成和调用方法。
C动态库的生成
C版动态库的编译 : 动态库是用C写的
libtest.h
#ifndef _LIBTEST_H_
#define _LIBTEST_H_
#ifdef WIN32
#define API WINAPI
#else
#define API
#endif
#include <stdio.h>
int API test(); //库接口
#endif
libtest.c
#include "libtest.h"
int API test()
{
printf("this is a so test\n");
}
Makefile
COMP := gcc # C写的动态库要用gcc编译
TARGETDIR := Bin
TARGET := libtest.so
ifeq (Y, $(X86))
COMP := $(COMP)
else
COMP := arm-linux-$(COMP)
endif
#源文件
SRCS := testlib.c
#.o文件
OBJS := testlib.o
#将所有.o文件编译为目标文件 编译.so需要加 -shared -fPIC
all:$(OBJS)
$(COMP) -shared -fPIC -o $(TARGET) $(OBJS)
#将libtest.so复制到当前目录下的Bin目录下,所以提前创建一个Bin文件夹
cp $(TARGET) ./$(TARGETDIR)/
#删除 .o 和so文件
$(RM) *.o $(TARGET) #删除当前目录下的.o文件和libtest.so
$(OBJS):
$(COMP) -c $(SRCS)
# make clean
clean:
$(RM) *.o $(TARGET)
C++ 调用 C版动态库
首先,将libtest.so 链接到 /usr/lib/ 目录下 ,指令 `
ln -s libtest.so的绝对目录 /usr/lib/
链接就相当于一个快捷方式,程序调用动态库时,就会从/usr/lib/目录下的链接找到
动态库所在目录
如果不做链接 调用动态库时 就会找不到库
创建一个.h文件,声明动态库接口, 这里起名api.h
#ifndef _API_H_
#define _API_H_
#ifdef WIN32
#define API WINAPI
#else
#define API
#endif
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
int API test();
#ifdef __cplusplus
}
#endif
#endif
注意事项
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
为什么要加这段呢
在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件,
请用C的方式来链接它们。
如果不加,会报错:
undefined reference to `test()'
collect2: ld returned 1 exit status
*/
调用方式
#include "api.h"
int main(int argc,char* argv[]){
test();
return 0;
}
编译方式
Makefile
COMP := g++
TARGET := test
SRCS := test.cpp
ifeq (Y, $(X86))
COMP := $(COMP)
else
COMP := arm-linux-$(COMP)
endif
all:
$(COMP) $(SRCS) -o $(TARGET) -ltest
clean:
$(RM) *.o $(TARGET)
执行 test 完毕
C++动态库的生成
如果上述动态库是用C++编译的 即:libtest.c 改为libtest.cpp 该怎么编译呢
- 修改编译动态库的Makefile
gcc 改为 g++
testlib.c 改为 testlib.cpp - 去掉 api.h 中 extern “C” 部分
本文介绍了如何在Linux环境下编译和调用动态库。首先讲解了C语言动态库的生成过程,包括libtest.h和libtest.c的编译,接着演示了C++如何调用C版动态库,强调了头文件声明和调用方式。最后,文章讨论了C++动态库的生成,指出当源文件为libtest.cpp时,需要修改Makefile以使用g++编译,并去除extern "C"声明。
1383

被折叠的 条评论
为什么被折叠?



