You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过公共头文件在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:50:17