我正在尝试在纯 c++ 类 (.cpp) 和纯 Objective-c 对象 (.m) 之间创建一个 Objective-C++ 包装器 (.mm)。可以在 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+)