在Objective-C块中调用C函数(链接器错误)

Ber*_*rgP 1 c iphone linker objective-c ios

我创建了C函数:

//FileSystem.h file
#import <Foundation/Foundation.h>
BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);
Run Code Online (Sandbox Code Playgroud)

履行

//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;
}
Run Code Online (Sandbox Code Playgroud)

当我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];
    };
Run Code Online (Sandbox Code Playgroud)

在那个地方,在进行链接时,有错误:

体系结构i386的未定义符号:
" AddSkipBackupAttributeToItemAtURL",引自:__ 36- [UpdateFileAsyncOperation start] UpdateFileAsyncOperation.o中的_block_invoke ld:未找到架构i386 clang的符号:错误:链接器命令失败,退出代码为1(使用 - v看看调用)

我不明白为什么会发生这种情况,它取决于阻止?我该如何解决这个问题?谢谢!

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

Ber*_*rgP 7

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

问题文件的扩展名为".m",其他文件的扩展名为".mm".

所以我在FileSystem.h文件中推出了下一个宏

#ifdef __cplusplus
extern "C" {
#endif

BOOL AddSkipBackupAttributeToItemAtURL(NSURL *url);

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)