首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能创建一个具有未解析符号的MacOS框架?

为什么我不能创建一个具有未解析符号的MacOS框架?
EN

Stack Overflow用户
提问于 2012-05-19 00:10:45
回答 2查看 301关注 0票数 1

我认为动态库(以及苹果的Mach-O框架)的一个特性是,在使用的应用程序链接之前,不要定义一些符号(方法),但是为了clang++成功构建框架,似乎所有的符号都必须被解析。

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

下面是Objective和ANSI例程包含的头文件:

代码语言:javascript
复制
// FlightVehicleCAdapter_data.h

#ifndef FlightVehicleCAdapter_data_h
#define FlightVehicleCAdapter_data_h

#ifdef __cplusplus
external "C" {
#endif

extern void aero( void );

#ifdef __cplusplus
}
#endif

这就是它的名字所在:

代码语言:javascript
复制
// 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()实现的情况下构建它:

代码语言:javascript
复制
Undefined symbols for architecture [i386|x86_64]:
  "_aero", referenced from:
    -[FlightVehicleCAdapter calcAero] in FlightVehicleCAdapter.o

因此,我定义了一个虚拟的aero()例程:

代码语言:javascript
复制
// 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()的这一定义满足clang++,因此成功地构建了Mach-O框架(动态库)。但是,当我将结果框架与应用程序目标(其中包括一个重要的aero()例程)链接时,将调用框架的虚拟aero()而不是应用程序的aero()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-19 10:43:53

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

票数 3
EN

Stack Overflow用户

发布于 2012-05-19 00:21:08

您需要为aero()这样做:

代码语言:javascript
复制
#ifdef __cplusplus
extern "C" {
#endif

extern void aero( void );

#ifdef  __cplusplus
}
#endif

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

请注意,那么aero()可以在运行时进行链接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10661234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档