linux平台中c代码调用c++动态库

来源:互联网 发布:中研世纪 知乎 编辑:程序博客网 时间:2024/05/24 01:49
  1. 首先,我们先需要添加一个外壳,外壳的功能是:将c++的类的方法进行包装,形成类似C语言的库函数

我们需要建立一个.cpp文件和一个头文件,例如:

HBShell.cpp:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include "HrvBike.h"#include "HBShell.h"hrvBikeInterface *pInterface = NULL;//int isOk = 0;void initHrvInterface() {    if (pInterface == NULL) {        pInterface = new hrvBikeInterface();    }}//hrvBike.calHrvParamsMain(spath, despath, age, gender);void calHrvParamsMain(char* spath, char* despath, int age, int gender) {    if (pInterface != NULL) {        pInterface->calHrvParamsMain(spath, despath, age, gender);    }}

HBShell.h:

#ifndef HB_SHELL#define HB_SHELLextern void initHrvInterface();extern void calHrvParamsMain(char* spath, char* despath, int age, int gender);#endif
  1. 编译动态库,考虑到代码是c++,所以编译指令最好用g++编译(否则再c调用的时候,可能会出现问题)
    指令:

g++ HRVAnalysis.cpp HRVBasic.cpp hrvBike.cpp HRVParameters.cpp
HBShell.cpp -fPIC -m64 -shared -o libHrv.so

会在当前目录下生成libHrv.so的动态库。

  1. 编写调用该动态库的代码,该代码我们用c文件来实现,例如:
    test.c:
#include <stdio.h>#include "HBShell.h"int main(){    initHrvInterface();    calHrvParamsMain("/usr/shareBike/hrvBike1.1/data/ecgdata.rr", "/usr/shareBike/hrvBike1.1/data/", 18, 1);    if (getHrvFlag() == 1) {        printf("getHighestHr---->%d\n", getHighestHr());        printf("getLowestHr---->%d\n", getLowestHr());        printf("getAvrHr---->%d\n", getAvrHr());        printf("getStressScore---->%d\n", getStressScore());        printf("getStressLevel---->%d\n", getStressLevel());    }    return 0;}

这里需要注意,一定要将动态库里的HBShell.h这个头文件包含进来。否则会报错。

  1. 生成test.c的可执行文件,需要用指令:

g++ test.c -lHrv -L. -I. -o test

需要注意,这里请用g++编译,否则会造成c库和c++库函数引用的混乱。从而产生undefined reference之类的错误。

这里会生产test这样一个可执行文件,通过指令./test即可正常执行。

参考文档:
http://www.linuxidc.com/Linux/2013-11/93010.htm

0 0