【问题标题】:Exposing C function from custom Objective-C Framework从自定义 Objective-C 框架中公开 C 函数
【发布时间】:2011-03-29 17:07:26
【问题描述】:

我正在尝试编写我的第一个自定义 Cocoa 框架,并且我想从框架中公开一个简单的 C 函数,该函数包含一堆功能,就像 NSApplicationMain 所做的那样。当我直接从项目中直接导入文件时,一切正常,项目构建完成,我的 C 函数被正确调用。

现在我有一个包含文件的新 Cocoa 框架项目,我无法构建我的程序,因为我收到“未找到符号”错误消息,特别是针对我的 C 函数。

我已经尝试在头文件中的函数定义前加上extern,但仍然没有。

谁能给我一个提示?如何通过自定义 Cocoa 框架公开标准 C 函数?

大致了解我在做什么:

使用我的自定义框架的程序:

#import <BDWebApplicationFramework/BDWebApplication.h>

int main (int argc, const char * argv[]) {
    return BDWebApplicationMain(argc, (const char **)argv);
}

我的框架头文件:BDWebApplication.h

#import <Foundation/Foundation.h>

@interface BDWebApplication : NSObject {
    NSString *name;
}
@property (readwrite, copy) NSString *name;

@end

extern int BDWebApplicationMain(int argc, const char * argv[]);

我的框架文件:BDWebApplication.m

#import "BDWebApplication.h"

@implementation BDWebApplication

@synthesize name;

- (id)init
{
    [super init];
    name = @"New name";
    return self;
}

- (void)dealloc
{
    [name release];
    [super dealloc];
}

@end

int BDWebApplicationMain(int argc, const char * argv[])
{
   // Do some Obj-c stuff here
}

【问题讨论】:

    标签: c objective-c frameworks


    【解决方案1】:

    几乎可以肯定,这里的问题隐藏在您的 Xcode 构建设置中,而不是您发布的代码中(看起来不错)。

    首先要做的事:您是否链接到您的新框架?假设你是,你确定你实际上是在导出你在构建框架时认为的符号吗? (有许多选项可以指定这一点,其中一些具有语义,可能会让粗心的人感到惊讶。)

    对于帮助您诊断此问题更有用的是框架和可执行文件的 Xcode 构建脚本的全文。

    【讨论】:

    • 我最初按照此处的说明:atastypixel.com/blog/… 在我的程序项目中创建一个框架项目,该项目还应该创建一个可用于我的任何其他项目的框架。我的项目的源代码可在此处获得,经过 tar 和 gzip 压缩,供您检查。下载不到 7Mb:restafarian.com/stackoverflow/stackoverflow.tgz 感谢您提供的任何帮助和建议!
    • 问题确实是您的 BDWebAppTest 目标没有与您的 BDWebApplicationFramework 框架(原文如此)链接。要看到这一点,请在目标大纲下公开完整的依赖关系树,并特别注意“Link Binary With Libraries”步骤。你会看到现在它只链接到 Foundation.framework。您可以通过将框架拖放到链接框架列表中来解决该问题。 (可能还有 RegexKit,因为我认为您的项目引用它是有原因的。)
    • 优秀的东西,如描述的那样工作。据我所知,我不需要将 RegexKit 与我的程序链接,因为它应该与我的框架链接,因为只有我的框架将在幕后使用 RegexKit。谢谢你的帮助,我知道我一定错过了什么。我在原始博客上发表了评论,我遵循了他的指示,并要求他将此步骤添加到他的指示中。希望这能帮助遇到类似问题的其他人。
    • 请注意:我会将我的示例项目留在上面的地址几个月,以防万一其他人有类似的问题,并希望按照这些说明了解 Kaelin 的建议解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多