在开发pod库时,遇到了一个编译报错的问题,记录一下。
主pod是OC实现的,主pod里依赖了WCDB(一个OC++库),主pod里有一个子pod,子pod采用swift实现。当宿主工程集成子pod时,编译通不过,报错在:WCDB.h里。Since WCDB…
1 2 3 4 5 6 #ifndef WCDB_h #define WCDB_h #ifndef __cplusplus #error Since WCDB is an Objective-C++ framework, for those files in your project that includes WCDB, you should rename their extension .m to .mm. #endif
Google了半天也没搜到类似的,感觉应该是混编导致的错误。
我的podspec文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 spec.swift_versions = ['5.5' , '5.6' , '5.7' ] spec.requires_arc = true spec.dependency "CocoaLumberjack" , "~> 3.7.4" spec.dependency "WCDB" , "~> 1.1.0" spec.default_subspecs = 'Core' spec.subspec 'Core' do |ss| ss.source_files = 'Sources/MATLog/**/*.{h,m,mm}' end spec.subspec 'Swift' do |ss| ss.dependency 'MATLog/Core' ss.source_files = 'Sources/MATLogSwift/**/*.{swift,h,mm}' end
子pod里压根就没使用到WCDB,很奇怪为啥会报那个错。搜也无从搜起,冥思苦想半天,也就 MATLogModel+WCTTableCoding.h
头文件里包含了WCDB.h,后来发现确实是这里引起的。
因为OC pod库头文件默认是public,所以子库能访问到主库所有暴露的头文件,修改podspec文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 spec.swift_versions = ['5.5' , '5.6' , '5.7' ] spec.requires_arc = true spec.dependency "CocoaLumberjack" , "~> 3.7.4" spec.dependency "WCDB" , "~> 1.1.0" spec.default_subspecs = 'Core' spec.subspec 'Core' do |ss| ss.source_files = 'Sources/MATLog/**/*.{h,m,mm}' ss.private_header_files = 'Sources/MATLog/*WCTTableCoding.{h}' #控制OC头文件访问权限的有private 、project 、public 三种。默认public end spec.subspec 'Swift' do |ss| ss.dependency 'MATLog/Core' ss.source_files = 'Sources/MATLogSwift/**/*.{swift,h,mm}' end
这时 MATLogModel+WCTTableCoding.h
头文件就变成private了,编译也能通过了。