Android Native库混用C和C++的 undefined reference to XXX 解决方法
2019年2月18日
因为业务的需要,需要在C++写的Native库中调用由C语言写的SO库。
之前就已经知道,如果想在Native层上混用C语言和C++所写的代码,就必须要在C++的函数声明上增加 extern "C"
的标识,或者使用 extern "C" {}
包含多个C++的函数声明。
如果不这么做,会导致编译时出现链接器无法链接函数的问题,所提示的错误类似于error: undefined reference to 'init(int)'
。
除此之外,还有几个坑点需要注意!
使用 extern "C" {}
时,务必要把你需要链接到的C语言的库的头文件也包含在里面,如:
1 | extern "C" { |
并且,需要把类似于 map
这样的使用了模板的C++库放在 extern "C"
的外部。下面是错误示范:
1 | extern "C" { |
这样会引发类似下面的错误: error: templates must have C++ linkage
下面是正确示范:
1 | // C++使用了模板的库 |
希望大家注意这些问题。
除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。