用C调用C++函数来看extern "C"的作用

extern "C" 这个东西不知道在书上和别人的代码里看到过多少次了,但是就是从来没有好好了解过,结果有一次项目对接问题就出在了这里。果然遇到问题才是学习的最好途径啊!

情况是这样的:我用C++代码写了大一堆东西,然后我要把自己写的东西生成一个动态库给别人调用。但是别人在调用的时候,就面临一个问题:别人无论是用C语言还是C++语言写调用代码,都能成功调用吗?答案是不能。下面做个测试。

测试平台:Ubuntu16.04

首先我用C++写了一堆代码,实现了一个功能,然后这个功能要给别人调用,因此我需要把这个功能打包成动态库.so给别人,除此之外我还需要写一个头文件,声明调用的接口函数告诉别人怎么调用。到最后就把这个test.so文件和api_test.h文件给别人就好了。

test.so文件理论上来讲是一个已经封装过的东西,所以只要第三方的语言支持调用.so这种库文件,那么你生成so文件时用的是C还是C++就无所谓了,只要功能是正确的就行,所以这件事的核心焦点还是在api_test.h这个接口头文件上。下面我们就来看看这个头文件。

我们先从最简单最本能的地方来看,我的功能是用C++实现的,所以最自然的调用当然应该是用C++了,所以我们来写一个假设对方用C++时的调用接口:

#ifndef _API_TEST_H_
#define _API_TEST_H_

double api_test(int a, int b);

#endif 

再写一段调用代码test_usecpp.cpp:

#include "api_test.h"
#include 

int main()
{
    int a = 5;
    int b = 8;
    double ratio = api_test(a, b);
    std::cout << "Output by C++:" << std::endl;
    std::cout << "ratio = " << ratio << std::endl;

    return 0;
}

然后我们会发现,如果像上面这样调用,是无法调用成功的,为什么呢?看提示的错误信息:

/tmp/ccOPdXUw.o: In function `main':
test_usecpp.cpp:(.text+0x18): undefined reference to `api_test(char const*)'
collect2: error: ld returned 1 exit status

提示api_test这个接口函数没有定义,这就表示找不到接口函数。








你可能感兴趣的:(用C调用C++函数来看extern "C"的作用)