如何通过公共头文件在.m与.mm文件间共享全局函数?
解决Objective-C与Objective-C++间全局函数符号未定义问题
问题场景
通过公共头文件abc.h共享全局函数GetInputSizeFromUsage:
file1.m(Objective-C文件)实现了该函数,自身调用编译正常;file2.mm(Objective-C++文件)调用该函数时,编译报错:
Undefined symbol: GetInputSizeFromUsage(PPVEUsage, unsigned long*, unsigned long*)
问题原因
- 纯Objective-C文件(
.m)编译时,函数符号遵循C语言命名规则; - Objective-C文件(
.mm)编译时,会对函数名进行**C名字修饰(Name Mangling)**,导致链接阶段无法匹配C风格的函数符号。
解决方案
修改公共头文件abc.h,用条件编译包裹函数声明,确保C++编译环境下以C风格解析函数:
/** @function GetInputSizeFromUsage @abstract return frame width and height from usage @param usage PPVEUsage to be inqure @param width (out) the input width for usage @param height (out) the input height for usage */ #ifdef __cplusplus extern "C" { #endif void GetInputSizeFromUsage(PPVEUsage usage, size_t *width, size_t *height); #ifdef __cplusplus } #endif
说明
__cplusplus是C++编译器专属宏,file2.mm编译时会触发extern "C",强制编译器以C语言规则处理该函数的符号;file1.m编译时__cplusplus未定义,跳过extern "C"代码块,不影响原有逻辑编译。
修改后无需改动file1.m和file2.mm的实现代码,即可正常完成跨文件函数调用。
内容的提问来源于stack exchange,提问作者GoswamiK
相关产品推荐
相关产品推荐

