gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:09 24 4
gpt4 key购买 nike

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

这是 C 辅助函数的 header :

#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];
}

我试过使用和不使用外部“C”进行编译,但链接器错误结果相同。

任何人都可以阐明我做错了什么吗?

链接器错误:

Undefined symbols for architecture i386:
"loadMeshFromFile(char const*, void*)", referenced from:

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

最佳答案

使用以下构造为 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++ 兼容。

关于c++ - 在 Objective-C 代码中使用 extern "C"的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com