【问题标题】:Calling C function in Objective-C block (Linker error)在 Objective-C 块中调用 C 函数(链接器错误)
【发布时间】:2013-08-24 12:27:46
【问题描述】:

我已经创建了 C 函数:

标题

//FileSystem.h file
#import <Foundation/Foundation.h>
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);

实现

//FileSystem.mm
#import "FileSystem.h"
#import <sys/xattr.h>
#import <Support/Support.h>

static const char* attrName = "com.apple.MobileBackup";
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url) {
    BOOL operationResult = NO;
    // some implementation
    return operationResult;
}

当我从应用程序的其他部分调用 AddSkipBackupAttributeToItemAtURL 时,一切正常,除了我从块中调用函数的地方。

__block UpdateFileAsyncOperation* selfOperation = self;
    _contentDownloader.completionBlock = ^(NSData* data) {
        [data saveForcedToPath:selfOperation.filePath];
        NSURL* fileUrlWithScheme = [NSURL fileURLWithPath:selfOperation.filePath];
        AddSkipBackupAttributeToItemAtURL(fileUrlWithScheme);
        [runLoop removePort:port forMode:NSDefaultRunLoopMode];
        [selfOperation completeOperation];
    };

在那个地方,在链接过程中,出现错误:

架构 i386 的未定义符号:
AddSkipBackupAttributeToItemAtURL”,引用自: __36-[UpdateFileAsyncOperation start]_block_invoke in UpdateFileAsyncOperation.old:未找到架构的符号 i386 clang:错误:链接器命令失败,退出代码为 1(使用 -v 到 见调用)

我不明白它为什么会发生,它如何依赖于块?我该如何解决? 谢谢!

更新:它不依赖于块,我已将函数调用移动到另一个类的地方:错误仍然存​​在。我正在寻找原因

【问题讨论】:

标签: iphone ios objective-c c linker


【解决方案1】:

我已经解决了这个问题。 它不依赖于块。它依赖于文件扩展名。

问题文件的扩展名为“.m”,其他文件的扩展名为“.mm”。

所以我在 FileSystem.h 文件中放入了下一个宏

#ifdef __cplusplus
extern "C" {
#endif

BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);

#ifdef __cplusplus
}
#endif

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2014-01-22
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多