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

如何解决如何在“ 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?