Expected unqualified-id系统头文件引入编译错误分析和解决

957 阅读1分钟

今天在把C++工程引入方式从.a改为源码引入时遇到Expected unqualified-id的错误:

一、背景

有一个C++工程A,通过cmake编译产物为A.a

有一个OC工程B,作为pod组件将被合入到主工程C中

原来的工程目录是这样的:

B工程
- A.a
- B的源码目录

这样在B工程中,调试A源码很不方便,可以通过符号断点调试,但是:
1、这要求调试方必须有源码,且重新编译出A.a;

2、在这种情况下再编译还是用的原来.a文件,修改调试跳转到的源文件不会生效

所以源码引入提上日程。参考libpag,考虑把A的源码拷贝到B工程目录下,然后在B工程的podspec中配置源码调试。

改为源码引入时的工程目录是这样:

B工程
- A的源码目录
- B的源码目录

二、遇到问题:

在pch引入其他OC库的头文件时出现编译问题Expected unqualified-id。

这个错误在搜索引擎搜索Expected unqualified-id普遍是因为少了个;或者{}没对齐

仔细查看build发生错误的地方,发现是新的cpp编译时错误,而且错误发生在@class

搜索Unknown type name 'NSString'发现了如下答案:

stackoverflow.com/questions/5…

众所周知,有cpp代码和oc代码的文件后缀是.mm

于是猜测是新引入的cpp源文件也会导入PCH的头文件,但是因为文件后缀名是cpp而不是.mm所以报错

三、解决:

增加#ifdef __OBJC__ 和 #endif的宏定义代码,如下所示:

#ifdef __OBJC__

#import <UIKit/UIKit.h>
#import ....

#endif

从而限制pch里的头文件引入,只有OC文件才引入这两个头文件。

出现

Module 'ObjectiveC.NSObject' requires feature 'objc'

Could not build module 'Foundation'

Could not build module 'UIKit'

这种系统头文件引入的报错 解决方法也一样: