在Objective-C代码中使用extern"C"的链接器错误

dew*_*ker 4 c c++ linker objective-c extern

我正在尝试创建一些可以从iPhone应用程序中的Objective-C和C++代码调用的实用程序函数.我有第三方C++类,无法编译为ObjectiveC++(.mm).我有一个头文件声明我的函数,然后是.c文件定义它们.我已检查拼写错误三倍,但由于某种原因,我的链接器无法找到任何函数的定义.

这是C帮助函数的标题:

#ifndef FILE_LOADER_H
#define FILE_LOADER_H

#if __cplusplus
extern "C" {
#endif

void * loadDataFromFile(const char * szFilename, bool bDocument);
void * loadImageFromFile(const char * szFilename, bool bDocument);
void loadMeshFromFile(const char *szFilename, void* pMesh);

#if __cplusplus
}   // Extern C
#endif

#endif
Run Code Online (Sandbox Code Playgroud)

这是.c文件:

#include "FileLoader.h"
#include <objc/objc.h>
#include <objc/message.h>
#include <Foundation/Foundation.h>


void * loadDataFromFile(const char * szFilename, bool bDocument)
{
    Class loaderClass = NSClassFromString(@"Loader");
    void * pReturnVal = objc_msgSend(loaderClass,   NSSelectorFromString(@"loadDataFromFile:document"), szFilename, bDocument);
    return pReturnVal;
    //return [Loader loadDataFromFile:szFilename document:bDocument];
}
void * loadImageFromFile(const char * szFilename, bool bDocument)
{
    Class loaderClass = NSClassFromString(@"Loader");
    void * pReturnVal = objc_msgSend(loaderClass, NSSelectorFromString(@"loadImageFromFile:document"), szFilename, bDocument);
    return pReturnVal;
    //return (void*)[Loader loadImageFromFile:szFilename document:bDocument];
}
void loadMeshFromFile(const char *szFilename, void* pMesh)
{
    Class loaderClass = NSClassFromString(@"Loader");
    objc_msgSend(loaderClass, NSSelectorFromString(@"loadMeshFromFile:mesh"), szFilename, pMesh);
    //[Loader loadMeshFromFile:szFilename mesh:pMesh];
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用和不使用extern"C"进行编译,但是使用相同的链接器错误结果.

有人能说清楚我做错了吗?

链接器错误:

Undefined symbols for architecture i386:
"loadMeshFromFile(char const*, void*)", referenced from:
Run Code Online (Sandbox Code Playgroud)

更新:我似乎通过将我的源文件编译为目标C来解决问题,即使没有实际的ObjectiveC代码,有人能告诉我为什么上面的源文件不能编译为C代码吗?

jus*_*tin 8

使用以下构造为c和c ++转换指定c链接:

#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
// declare loadMeshFromFile
MONExternC void loadMeshFromFile(char const*, void*);
Run Code Online (Sandbox Code Playgroud)

此声明将与c,objc,c ++,objc ++兼容.