今天在把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'
这种系统头文件引入的报错 解决方法也一样: