考虑开发一个应用程序,其中模型将用C++编写(使用Boost),视图将使用Objective-C++(使用Cocoa Touch)编写.
哪些示例展示了如何集成C++和Objective-C++来开发iPhone应用程序?
我正在将我的App Delegate文件从.m转换为.mm(Objective-C到Objective-C++),以便我可以访问用Objective-C++编写的第三方库.在Objective-C中,我的app委托构建并运行良好.但是当我更改扩展时,项目构建并且我得到链接错误,所有这些都是我用C编写的静态库中缺少的符号.错误是经典链接错误,格式如下:
"MyFunction(arguments)",引自:
- MyAppDelegate.o中的[MyAppDelegate myMethod]
未找到符号
所有问题都在app delegate对象中.我知道我已经准备好编译Objective-C++,因为我的ViewController文件是.mm.所以我的问题有几个部分.
首先,这些符号真的不存在,因为我不能使用它们吗?换句话说,是不是可以从Objective-C++文件访问普通的旧C函数?如果这是真的,那很不幸.我认为几乎所有的Objective-C代码,以及至少构建为.mm的所有Objective-C代码都是有效的Objective-C++.我错了吗?
如果没有,任何想法如何防止这些错误?是否存在Objective-C++中我不了解的标题规则?
感谢您的帮助.
在Objective-C中我有有效的代码:
TestTwo.h:
@interface TestTwo : NSObject
-(void)test;
@end
Run Code Online (Sandbox Code Playgroud)
TestTwo.m:
@implementation TestTwo
-(void)test
{
void (^d_block)(void) =
^{
int n;
};
}
@end
Run Code Online (Sandbox Code Playgroud)
我真正想要的是一个Objective-C++类,它定义了一个类似的方法test.这是简化,但说明了意图.所以,在Objective-C++中,我有:
Test.h:
class Test
{
public:
void TestIt();
};
Run Code Online (Sandbox Code Playgroud)
Test.mm:
#include "Test.h"
void Test::TestIt()
{
void (^d_block)(void) =
^{
int n;
};
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:'int Test :: n'不是'class Test'的静态成员.
如果我删除int n;没有错误.如何n在此上下文中的块中定义?
我在客观的C++中工作.我坚持的问题是我需要将std :: vector传递给目标c方法.这可能吗?下面是我当前的代码,我必须在向量定义方法中对向量进行计算(向数组成员添加偏移值),然后再将该方法作为C数组传递给该方法.理想情况下,我想在第二种方法中设置偏移值,从而拆分定义(将有几个)偏移量将是变量,与下面的示例不同.
因此,我想使用矢量而不是传入(b2Vec2*)vect
- (void)createterrain1 {
using namespace std;
vector<b2Vec2>vecVerts;
vector<int>::size_type i;
vecVerts.push_back(b2Vec2(-1022.5f / 100.0, -20.2f / 100.0));
vecVerts.push_back(b2Vec2(-966.6f / 100.0, -18.0f / 100.0));
vecVerts.push_back(b2Vec2(-893.8f / 100.0, -10.3f / 100.0));
vecVerts.push_back(b2Vec2(-888.8f / 100.0, 1.1f / 100.0));
vecVerts.push_back(b2Vec2(-804.0f / 100.0, 10.3f / 100.0));
vecVerts.push_back(b2Vec2(-799.7f / 100.0, 5.3f / 100.0));
vecVerts.push_back(b2Vec2(-795.5f / 100.0, 8.1f / 100.0));
vecVerts.push_back(b2Vec2(-755.2f/ 100.0, -9.5f / 100.0));
vecVerts.push_back(b2Vec2(-632.2f / 100.0, 5.3f / 100.0));
vecVerts.push_back(b2Vec2(-603.9f / 100.0, 17.3f / 100.0));
vecVerts.push_back(b2Vec2(-536.0f / 100.0, 18.0f / 100.0));
vecVerts.push_back(b2Vec2(-518.3f / …Run Code Online (Sandbox Code Playgroud) 我在情感上依赖于我的C++类,但我真的希望它进入一个tableview.
有没有办法从标准的c ++类中继承NSObject?
这是我试图做的:
class Model : NSObject {
public:
NSString *key;
};
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢它.
它告诉我基本说明符必须是一个类.
我能做什么鬼鬼祟祟的事吗?
我应该把它作为标准的目标C++对象吗?
我创建了一个运行一些C++(OpenCV)代码的Objective-C++项目.它运行良好,一切运作良好.但后来我决定将这些例程作为子项目添加到我的MAIN PROJECT中,每当我尝试使用子项目类时都会出错.
问题是,我的SUBPROJECT使用.mm源文件,而我的MAIN PROJECT只使用.m源文件:
每次我尝试分配类DyOpenCV(DyOpenCv *opencv = [DyOpenCv alloc])时,我都会遇到很多错误:
这是Obj-C与Obj-Cpp项目合并的提示吗?这是一个特殊的界面,一旦我尝试从.m文件运行.mm文件?即使.mm文件来自子项目?是否有必要将我的子项目的所有库添加到我的项目中(我已经这样做了)?
干杯,
我对自己正在观察的情况感到困惑,并且会喜欢一些见解.首先,我使用Xcode 5,将LLVM 5编译器选项设置为默认值.
我在.m文件中有一行,例如:
static NSArray * const kSchemaVersions = @[@"1"];
Run Code Online (Sandbox Code Playgroud)
并且,正如预期的那样,我看到编译器错误说 Initializer element is not a compile-time constant.
但是,如果我将同一行放在.mm(Objective C++)文件中,编译器不会抱怨.
我完全明白为什么它不起作用,但我很困惑为什么它似乎.
思考?
这真让我抓狂.
我在foo.h文件中有一个C++类声明.
class foo // error marks are here
{
};
Run Code Online (Sandbox Code Playgroud)
当我#include/#import在我的fooUser.mm文件中的这个标题时,它编译.当我#include/#import在我的fooUser.h文件中执行它时,它没有,并且编译器错误是.
Unknown type name 'class'; did you mean 'Class'?
Excpected ';' after top level declarator.
Run Code Online (Sandbox Code Playgroud)
我正在使用XCode 4.2,LLVM编译器3.0,......这应该是重要的.
我正在开发视频流应用,其中我需要捕获前置摄像头视频帧并编码然后转移到另一端,典型的流程是这样的
AVCaptureSession - > AVCaptureDeviceInput - > AVCaptureVideoDataOutput - >捕获帧 - >编码帧 - >发送帧到另一端,
它工作正常,我已将kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange设置为帧格式.
还有用于显示预览的预览图层,
当设备方向发生变化时,问题就出现了,如果设备从纵向移动到横向,那么在另一端框架旋转90度,我期待自从预览层支持方向,所以我将在Capture回调中自动接收旋转缓冲区,但看起来,预览层只显示捕获的缓冲区的预览和UI orating缓冲区,而在另一端我会得到咆哮的缓冲区,
所以我想知道,有没有任何配置可以让它改变,或者我需要在Capture缓冲区回调中旋转/转换缓冲区.
我需要调用C ++方法并将回调方法作为参数传递...从ObjectiveC方法中...然后在ObjectiveC中会多次触发此回调方法...因为它是回调方法...所以我需要捕获该ObjectiveC回调方法,因为它将作为Swift代码的闭包被调用...
这是C ++方法签名
static bool cPlusPlusMethodWithCallBack(const std::string& someText, void (*someCallback)(unsigned int) = NULL, unsigned int someNum = 0);
Run Code Online (Sandbox Code Playgroud)
我的问题是,在ObjectiveC中(在.mm和.h中)声明的此回调方法的Block语法应该是什么,然后可以将其作为参数传递给C ++中的someCallback
我是一名Swift开发人员,因此对ObjectiveC有点困惑...非常感谢
objective-c++ ×10
objective-c ×6
c++ ×4
ios ×2
iphone ×2
armv7 ×1
boost ×1
box2d-iphone ×1
c ×1
cocoa-touch ×1
inheritance ×1
nsobject ×1
swift ×1
video ×1
xcode ×1