linux 动态库的编译、调用,(用Makefile编译)

本文介绍了如何在Linux环境下编译和调用动态库。首先讲解了C语言动态库的生成过程,包括libtest.h和libtest.c的编译,接着演示了C++如何调用C版动态库,强调了头文件声明和调用方式。最后,文章讨论了C++动态库的生成,指出当源文件为libtest.cpp时,需要修改Makefile以使用g++编译,并去除extern "C"声明。

我们在做一个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 该怎么编译呢

  1. 修改编译动态库的Makefile
    gcc 改为 g++
    testlib.c 改为 testlib.cpp
  2. 去掉 api.h 中 extern “C” 部分
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值