Android NDK 混合 C 和 C++ 错误未定义对 mult(int, int) 的引用
Android NDK mixing C and C++ error undefined reference to mult(int, int)
我有一个非常简单的CPP类和一个从我的CPP类调用的C函数。此外,我还使用 SWIG 在 JAVA 和本机之间生成粘合代码。
但是当我尝试使用 NDK 编译它时,如果编译失败并出现以下错误:
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 16 in ./AndroidManifest.xml
[armeabi] Compile++ thumb: swig_module <= swig_wrap.cpp
[armeabi] Compile++ thumb: swig_module <= myclass.cpp
[armeabi] Compile thumb : swig_module <= test.c
[armeabi] StaticLibrary : libstdc++.a
[armeabi] SharedLibrary : libswig_module.so
/Users/xxxxxxx/Documents/Android/adt-bundle-mac-x86_64-20131030/ndk/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: ./obj/local/armeabi/objs/swig_module/src/myclass.o: in function myclass::foo():jni/src/myclass.cpp:6: error: undefined reference to 'mult(int, int)'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libswig_module.so] Error 1
所以这是代码:
**test.h**
int mult(int a, int b);
**test.c**
#include "test.h"
int mult(int a, int b)
{
return a * b;
}
**myclass.h**
class myclass
{
public:
int foo();
};
**myclass.cpp**
#include "myclass.h"
#include "test.h"
int myclass::foo()
{
return mult(5,5);
}
**Android.mk**
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := swig_module
LOCAL_SRC_FILES := swig_wrap.cpp src/myclass.cpp src/test.c
include $(BUILD_SHARED_LIBRARY)
swig_wrap.cpp文件是使用以下命令从 SWIG 生成的
swig -java -c++ -package com.example.swigtest.swiggen -outdir src/com/example/swigtest/swiggen/ -o jni/swig_wrap.cpp jni/swig.i
**swig.i**
%module swig_module
%{
#include "src/myclass.h"
%}
%include "src/myclass.h"
我可以使用 g++ 编译本机代码,没有问题,但使用 NDK 它不起作用。
我真的需要它来工作,因为我想使用 SWIG 控制器功能进行回调(我在这里不显示只是为了让事情尽可能简单)。
任何帮助,不胜感激。
您正在使用 C 编译器构建 test.c,C++代码看不到 C 函数,除非您添加extern "C"
让C++链接器知道它是 C。
这样做:
test.h:
#ifdef __cplusplus
#define EXTERN extern "C"
#else
#define EXTERN
#endif
EXTERN int mult(int a, int b);
另一种方法是将 extern "C" 与 .cpp 文件中的 #include 一起使用。出于与其他答案相同的原因。这样,当包含 C 头文件时,整个事情都包装在 extern "C" 中,因此所有函数都可以被C++识别。
制作你的 myclass.cpp 文件 :
#include "myclass.h"
*other c++ includes here*
extern "C" {
#include "test.h"
*other c includes here*
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- Android NDK 混合 C 和 C++ 错误未定义对 mult(int, int) 的引用