0

我正在尝试在纯 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+)

4

1 回答 1

2

在 DummyModel.cpp 中,替换

static int test ()
{
    ...
}

经过

int DummyModel::test ()
{
    ...
}
于 2012-12-31T17:47:40.947 回答