因为业务的需要,需要在C++写的Native库中调用由C语言写的SO库。

之前就已经知道,如果想在Native层上混用C语言和C++所写的代码,就必须要在C++的函数声明上增加 extern "C" 的标识,或者使用 extern "C" {} 包含多个C++的函数声明。

如果不这么做,会导致编译时出现链接器无法链接函数的问题,所提示的错误类似于
error: undefined reference to 'init(int)'

除此之外,还有几个坑点需要注意!

使用 extern "C" {} 时,务必要把你需要链接到的C语言的库的头文件也包含在里面,如:

1
2
3
4
5
6
extern "C" {
// C语言所写的库
#include <openssl/xxx.h>

void init(int id); // C++函数声明
}

并且,需要把类似于 map 这样的使用了模板的C++库放在 extern "C" 的外部。下面是错误示范:

1
2
3
4
5
6
7
8
9
10
extern "C" {
// C++使用了模板的库
#include <map>

// C语言所写的库
#include <openssl/xxx.h>

void init(int id); // C++函数声明
}

这样会引发类似下面的错误: error: templates must have C++ linkage

下面是正确示范:

1
2
3
4
5
6
7
8
9
10
11
// C++使用了模板的库
#include <map>

extern "C" {

// C语言所写的库
#include <openssl/xxx.h>

void init(int id); // C++函数声明
}

希望大家注意这些问题。

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2019/02/18/Android-Native%E5%BA%93%E6%B7%B7%E7%94%A8C%E5%92%8CC-%E7%9A%84-undefined-reference-to-XXX-%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/