【发布时间】:2013-01-01 02:14:51
【问题描述】:
我正在尝试在纯 c++ 类 (.cpp) 和纯 Objective-c 对象 (.m) 之间创建一个 Objective-C++ 包装器 (.mm)。一个很好的工作示例可以是found on github。我可以毫无问题地构建和运行它。
但是我需要访问 c++ 类中的静态成员函数。我通过删除所有现有函数并引入静态成员函数来修改 github 示例:
// ==================
// DummyModel.h
// ==================
class DummyModel
{
public:
static int test ();
};
// ==================
// DummyModel.cpp
// ==================
#include "DummyModel.h"
static int test ()
{
int x = 1;
return x;
}
// ==================
// DummyModelWrapper.h
// ==================
#import <Foundation/Foundation.h>
@interface DummyModelWrapper : NSObject
- (int) test;
@end
// ==================
// DummyModelWrapper.mm
// ==================
#import "DummyModelWrapper.h"
#import "DummyModel.h"
@implementation DummyModelWrapper
- (int) test
{
int result;
result = DummyModel::test();
return result;
}
@end
这会产生以下错误:
Undefined symbols for architecture i386:
"DummyModel::test()", referenced from:
-[DummyModelWrapper test] in DummyModelWrapper.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
正是这个在 DummyModelWrapper.mm 中测试的引用导致了错误:
result = DummyModel::test();
测试项目改编自 github 项目,该项目以未经编辑的形式编译并运行良好(它实例化 DummyModel 并在实例上调用成员函数)。一旦我尝试添加一个静态成员并从包装对象访问它,就会发生错误。
我已经阅读了可以在 stackoverflow 和其他地方找到的所有内容,但只能找到涉及非静态成员函数的示例。
参考
http://www.philjordan.eu/article/mixing-objective-c-c++-and-objective-c++
http://robnapier.net/blog/wrapping-cppfinal-edition-759
http://www.boralapps.com/an-objective-c-project-that-uses-c/294/
环境
xcode 4.5.2/osx8.2(面向ios5+)
【问题讨论】:
-
如果您在“.m”文件中调用 C++ 代码,它不应该是“.mm”文件扩展名吗?还是源文件中的注释不准确?无论如何,请参阅下面的benjorbin's 答案。
-
是的,抱歉,这是一个错误的错字,已在问题中修复
标签: c++ objective-c xcode