为什么我不能使用未解析的符号创建MacOS框架?

时间:2012-05-19 00:10:45

标签: xcode macos frameworks

我认为动态库的一个特性(以及扩展Apple的Mach-O框架)是在使用应用程序被链接之前保留一些未定义的符号(方法),但似乎必须为{{1}解析所有符号成功构建一个框架。

例如,在构建飞行模拟的框架时,可能会留下一个名为clang++未定义的C例程(但带有'extern aero()'规范。)但是XCode 4.2拒绝构建框架,调用aero“未定义的符号。”

这是Objective-C和ANSI-C例程包含的头文件:

_aero

这就是它被召唤的地方:

// FlightVehicleCAdapter_data.h

#ifndef FlightVehicleCAdapter_data_h
#define FlightVehicleCAdapter_data_h

#ifdef __cplusplus
external "C" {
#endif

extern void aero( void );

#ifdef __cplusplus
}
#endif

我曾希望能够在应用程序中定义链接此框架的真实// FlightVehicleCAdapter.m -(void) calcAero { aero(); [self setBodyAeroForce_lb: [lsVector3 vectorFromScalarX:fv_data->f_aero_v.x Y:fv_data->f_aero_v.y Z:fv_data->f_aero_v.z]]; [self setBodyAeroMoment_ftlb:[lsVector3 vectorFromScalarX:fv_data->m_aero_v.x Y:fv_data->m_aero_v.y Z:fv_data->m_aero_v.z]]; } 例程,但在尝试构建框架本身时,链接器拒绝构建它具体的aero()实施:

aero()

然后我定义了一个虚拟Undefined symbols for architecture [i386|x86_64]: "_aero", referenced from: -[FlightVehicleCAdapter calcAero] in FlightVehicleCAdapter.o 例程:

aero()

// dummy_aero.c // not showing fv_data structure definition for clarity void aero(void){ fv_data->f_aero_v.x = 0.0; fv_data->f_aero_v.y = 0.0; fv_data->f_aero_v.z = 0.0; fv_data->m_aero_v.x = 0.0; fv_data->m_aero_v.y = 0.0; fv_data->m_aero_v.z = 0.0; } 的这个定义满足aero(),以便成功构建Mach-O框架(动态库)。但是,当我将生成的框架与包含非平凡clang++例程的应用程序目标链接时,正在调用框架的虚拟aero()而不是应用程序的aero()

2 个答案:

答案 0 :(得分:2)

您需要为aero()执行此操作:

#ifdef __cplusplus
extern "C" {
#endif

extern void aero( void );

#ifdef  __cplusplus
}
#endif

这确保函数在C ++中声明为具有C可解析名称。 C ++以不同于C的方式构建名称。

请注意,然后可以在运行时链接aero()。

答案 1 :(得分:2)

您需要将-bundle_loader <executable>选项传递给链接器,尽管我不确定它是否适用于框架。或者,您可以使用-undefined dynamic_lookup