NDK编译c包含C++头文件 error: unknown type name 'class' 的解决方法

本文探讨了解决C文件包含C++头文件时产生的编译错误问题,提供了两种有效方案:一是将C文件改为cpp文件,二是使用预处理器指令#ifdef__cplusplus确保C++特性仅在C++环境中生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行native开发的时候,难免会遇到C文件包含C++头文件而调用C++函数,若没做什么处理,直接include进行编译的话,会遇到以下错误:

error: unknown type name ‘class‘

error: expected ‘=‘, ‘,‘, ‘;‘, ‘asm‘ or ‘__attribute__‘ before ‘{‘ token

那么怎么解决呢?

首先,找下报错的原,从C以及C++特性不难发现:C文件include了带有C++关键字的头文件,如class等,因此,包含C++关键字的头文件被C编译器所编译,而不是用C++编译器编译,而C编译器无法识别C++的关键字,所以报错。那么解决方法很自然有两种方法:

第一种是最简单的就是统一用C++,把c文件改cpp;

第二种方法就是

在所有使用C++方法的地方加上:#ifdef __cplusplus,如:

#ifdef __cplusplus
class A{

};
#endif

注:如果使用了extern "C" ,也要加上#ifdef __cplusplus,因为C编译器无法识别extern "C":

#ifdef __cplusplus

extern "C" {

#endif

......

#ifdef __cplusplus

}

#endif

cmd.exe /C "cd . && D:\android-sdk-windows\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android24 --sysroot=D:/android-sdk-windows/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++14 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--gc-sections -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libmyapplication.so -o D:\Projects\MyApplication\app\build\intermediates\cxx\Debug\1h1g1tb5\obj\arm64-v8a\libmyapplication.so CMakeFiles/myapplication.dir/src/pdr_local_interface.cpp.o CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o CMakeFiles/myapplication.dir/native-lib.cpp.o D:/android-sdk-windows/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/24/liblog.so -landroid -llog -latomic -lm && cd ." ld: error: undefined symbol: Riemann::Pdr::RiemannPdr::GetInstance() >>> referenced by pdr_infer.cpp:20 (D:/Projects/MyApplication/app/src/main/cpp/src/pdr_infer.cpp:20) >>> CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o:(Riemann::Pdr::PdrInfer::Init(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >)) >>> referenced by pdr_infer.cpp:285 (D:/Projects/MyApplication/app/src/main/cpp/src/pdr_infer.cpp:285) >>> CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o:(Riemann::Pdr::PdrInfer::NetInference()) >>> referenced by native-lib.cpp:18 (D:/Projects/MyApplication/app/src/main/cpp/native-lib.cpp:18) >>> CMakeFiles/myapplication.dir/native-lib.cpp.o:(Java_com_example_myapplication_MainActivity_stringFromJNI) >>> referenced 1 more times
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值