0%

pod库依赖第三方OC++库编译报错问题

在开发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头文件访问权限的有privateprojectpublic三种。默认public
end

spec.subspec 'Swift' do |ss|
ss.dependency 'MATLog/Core'
ss.source_files = 'Sources/MATLogSwift/**/*.{swift,h,mm}'
end

这时 MATLogModel+WCTTableCoding.h 头文件就变成private了,编译也能通过了。

觉得文章有帮助可以打赏一下哦!