如何在“ mm”文件Objective-C ++中使用Cocos3D静态库中的Objective-C实用程序方法CC3Foundation.m?

问题描述

我正在构建使用以下内容的Cocos3D应用程序 iOS中的Cocos3D(Objective-C静态库)和Bullet Physics(C ++静态库)。

因此,我的大多数代码文件都是“ .mm”文件(Objective-C ++),可以同时使用Objective-C方法和C ++函数,并且在目标构建选项中带有“ -ObjC -lstdc ++”链接器标志。

问题是:在“ mm”文件中,从Cocos3D静态库的“ CC3Foundation.m”中调用实用程序方法会导致链接错误(“未定义符号”)。在Cocos3D中调用其他Cocos3D的类方法没有任何问题。

Cocos3D中的“ CC3Foundation.m”是可以由其他Objective-C类使用的实用程序方法(不是类成员方法)的文件。它没有任何类声明/实现。

// TestClass.h ("h" header file)
@interface TestClass
...
-(void) testMethod;
...
@end

// TestClass.mm ("mm" file)
#import "CC3Foundation.h"
@implementation TestClass
...
-(void) testMethod{
  CC3Vector va[2];
  
  // "NsstringFromCC3Vectors()" from "CC3Foundation.m" in Cocos3D static library.
  // Undefined symbol: NsstringFromCC3Vectors(CC3Vector*,unsigned int)
  NSLog(@"va: %@",NsstringFromCC3Vectors(va,2)); // link error

}
...
@end



// from cocos3D static library

// CC3Foundation.h
Nsstring* NsstringFromCC3Vectors(CC3Vector* vectors,gluint vectorCount);

// CC3Foundation.m
Nsstring* NsstringFromCC3Vectors(CC3Vector* vectors,gluint vectorCount) {
    NSMutableString* desc = [NSMutableString stringWithCapacity: (vectorCount * 8)];
    for (gluint vIdx = 0; vIdx < vectorCount; vIdx++)
        [desc appendFormat: @"\n\t%@",NsstringFromCC3Vector(vectors[vIdx])];
    return desc;
}

在“ m”个文件(Objective-C)中调用此“ NsstringFromCC3Vectors()”实用程序方法根本没有任何问题。该错误仅在“ mm”文件(Objective-C ++)中发生。 我用“ -lstdc ++”选项重建了Cocos3D静态库,但是没有任何变化。 mm文件中的方法仍然具有“未定义符号”链接错误

据我所知,关于如何混合使用Objective-C和C ++的代码应该是一个小问题,可以很容易地解决(希望如此)。否则,我别无选择,只能将应用程序的体系结构更改为使用“ m”文件而不是“ mm”。 如果能提供任何有用的答案,将不胜感激。谢谢。

配置信息:

Cocos3D v2.2(0x020002),Cocos2D v3.21(0x00030201)

子弹物理引擎:v2.88

Xcode:12.0.1,iOS:12.4.8

//更新(已解决)。

现在可以通过指定外部“ C”链接以根据“ C”而非“ C ++”正确包含头文件“ CC3Foundation.h”来解决此问题。 基本上,“ CC3Foundation.m”是“ C”功能文件,并且编译器和链接器需要知道,因为C和C ++具有不同的符号名称处理机制。因此,在没有外部“ C”链接的情况下,链接器无法从静态库中找到“ CCFoundation.m”中函数的符号名称,因此会发生链接错误

// TestClass.mm ("mm" file)

// Use extern "C" linkage to let compiler/linker kNow "CCFoundation.h/m" is "C" function files.
// Must import "CC3Foundation.h" first 
// because "CC3Foundation" is also imported in other classes 
// and those classes are also imported in this mm file.
extern "C" {
#import "CC3Foundation.h"
}

@implementation TestClass
...
-(void) testMethod{
  CC3Vector va[2];

  // "NsstringFromCC3Vectors()" from "CC3Foundation.m" in Cocos3D static library.
  NSLog(@"va: %@",2)); // no linker error

}
...
@end

Cocos3D中的Objective-C ++文件之一,“ CC3VertexArrayspodextensions.mm”使用“ CC3Foundation.h / m”,并且以相同的方式导入“ CC3Foundation.h”。

关于外部“ C”的有用帖子

What is the effect of extern "C" in C++?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...