我正在尝试创建一些可以从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
这是.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];
}
我尝试使用和不使用extern“C”进行编译,但是使用相同的链接器错误结果。
有人能说清楚我做错了吗?
链接器错误:
Undefined symbols for architecture i386:
"loadMeshFromFile(char const*, void*)", referenced from:
更新:我似乎通过将我的源文件编译为目标C来解决问题,即使没有实际的ObjectiveC代码,有人能告诉我为什么上面的源文件不会编译为C代码吗?
答案 0 :(得分:8)
使用以下构造为c和c ++翻译指定c链接:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
// declare loadMeshFromFile
MONExternC void loadMeshFromFile(char const*, void*);
此声明将与c,objc,c ++,objc ++兼容。
答案 1 :(得分:0)
仔细检查您的体系结构 - 链接器的问题是它不是在编译您的.c文件,而是它无法找出链接。所以这就是发生的事情......
编译器经过,无法找到正确编译.c文件的方法 链接器看到外部C链接,说“好吧让我们看看我们是否能找到它”找不到它,因为.c文件没有被编译成目标代码,哦,废话,中止。
你需要检查你的构建阶段 - 所以去你的目标,选择任何活跃的目标,看看在编译阶段发生了什么 - 我的猜测是,无论如何你想要的目标(发布或调试)得到了这个文件被添加为i386目标而不是arm,这就是为什么它很混乱,无法找到编译它的规则(你没有针对i386,所以它没有规则来编译它)。
如果所有其他方法都失败了,请尝试为arm建立一个全新的目标,看看你是否可以这样使用它,或者将目标从发布切换到调试等等。
如果你向我展示你正在编译的任何目标的快照,我可能会更有帮助:)。祝你好运!