这是我的 .mm 文件
#include "windowmanagerutils.h"
#ifdef Q_OS_MAC
#import </System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers/CGWindow.h>
QRect WindowManagerUtils::getWindowRect(WId windowId)
{
CFArrayRef windows = CGWindowListCreate(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
return QRect();
}
QRect WindowManagerUtils::getClientRect(WId windowId)
{
return QRect();
}
QString WindowManagerUtils::getWindowText(WId windowId)
{
return QString();
}
WId WindowManagerUtils::rootWindow()
{
QApplication::desktop()->winId();
}
WId WindowManagerUtils::windowFromPoint(const QPoint &p, WId parent, bool(*filterFunction)(WId))
{
return NULL;
}
void WindowManagerUtils::setTopMostCarbon(const QWidget *const window, bool topMost)
{
if (!window)
{
return;
}
// Find a Cocoa equivalent for this Carbon function
// [DllImport("/System/Library/Frameworks/Carbon.framework/Versions/Current/Carbon")]
// OSStatus ret = HIViewSetZOrder(this->winId(), …Run Code Online (Sandbox Code Playgroud) 我正在使用一个C++库(它恰好在iPad应用程序中,但我不确定它应该有什么区别)并且真的希望预编译头以加速构建,但xCode似乎通过C编译器而不是C++编译器运行预编译的头文件.
有没有办法让它使用正确的编译器?我已经将所有源文件从.m更改为.mm.
好吧,自昨天以来,我一直在努力解决这个奇怪的错误,所以我想是时候向社区提问了......
我目前正在使用Objective-C++,我在头文件中有一个纯粹的C++类声明,如下所示:
#ifndef __MATRIX_H__
#define __MATRIX_H__
#define USE_NEON_UPSAMPLING2X true
#define USE_NEON_THRESHOLD true
typedef float OCRfloat;
template<class T = OCRfloat>
class Matrix {
public:
...
Matrix threshold(T thresholdValue) const;
...
Matrix upsample2x() const;
...
};
#ifdef TARGET_OS_IPHONE
#if USE_NEON_UPSAMPLING2X
template<> Matrix<float> Matrix<float>::upsample2x() const;
#endif
#if USE_NEON_THRESHOLD
template<> Matrix<float> Matrix<float>::threshold(float thresholdValue) const;
#endif
#endif
#include "Matrix.cpp"
#endif
Run Code Online (Sandbox Code Playgroud)
它是模板类,具有基本矩阵运算,但是,我希望通过T = float上的模板特化来优化一些瓶颈.我有包含的Matrix.cpp文件,如下所示:
#include <iostream>
#include <cmath>
#if defined TARGET_OS_IPHONE
#include <Accelerate/Accelerate.h>
#endif
...
template<class T> Matrix<T> Matrix<T>::threshold(T thresholdValue) const {
... // …Run Code Online (Sandbox Code Playgroud) 我想在我的 Objective-C 类中声明一个 C++ 属性。
我应该将它设置为什么样的属性?似乎strongorretain会导致一个错误,说它不是一个对象。
我怎样才能正确管理它的内存?
这是一个最小的可重现示例,如果太长而无法阅读,请转到包含问题的下一部分,然后根据需要探索代码。
假设一个简单的 C++ 命令行:
主程序
#include <iostream>
#include "Wrapper.h"
int main()
{
Wrapper wrapper;
wrapper.run();
std::cout << "Exiting" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
Objective-C 包装器头文件:Wrapper.h
struct OCWrapper;
class Wrapper
{
public:
Wrapper() noexcept;
virtual ~Wrapper() noexcept;
void run();
private:
OCWrapper* impl=nullptr;
};
Run Code Online (Sandbox Code Playgroud)
及其实现:Wrapper.mm
#import "Wrapper.h"
#import "MyOCApp.h"
struct OCWrapper
{
MyOCApp* wrapped=nullptr;
};
Wrapper::Wrapper() noexcept: impl(new OCWrapper)
{
impl->wrapped = [[ MyOCApp alloc] init];
}
Wrapper::~Wrapper() noexcept
{
[impl->wrapped release];
delete impl;
}
void Wrapper::run()
{
[impl->wrapped run];
}
Run Code Online (Sandbox Code Playgroud)
最后是 Objective-C …
我昨天遇到了以下奇怪的行为.这对我来说似乎是一个编译器错误,还是有一些我错过的东西?我使用Objective-C到C++适配器类将Facebook Connect for iPhone的Objective-C类包装起来,这样就可以更方便地使用我们自己的OpenGL/C++代码.
以下代码显示了该问题.在下面的第一个变体中,编译器编译但是弄乱了vtable,因此调用了错误的方法.在第二个变体中,我们得到一个编译器错误,表明gcc很混乱.
评论试图更详细地解释这种情况.
#include <iostream>
#import <Foundation/Foundation.h>
// An abstract C++ interface
class Foo_cpp {
public:
virtual void foo() = 0;
};
// Another abstract C++ interface
class Bar_cpp {
public:
virtual void bar() = 0;
};
// An Objective-C to C++ adaptor.
// It takes a C++ interface Foo. When it's do_foo method is called it
// delegates call to Foo::foo.
@interface Foo_objc : NSObject {
Foo_cpp* foo_cpp_;
}
@end
@implementation Foo_objc
- (id)init:(Foo_cpp*)foo {
self …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Objective-C游戏,我正处于我应该开始在游戏循环中优化我的一些代码的阶段.
我使用了大量的类比较方法,
if([obj isMemberOfClass:[SomeClass class]])
等
我听说这种检查是相当昂贵的,因为我只选择有1个阵列填充了多个类,我需要某种类的检查.
我想也许在NSObject子类化NSObject中添加一个属性来包含一个字符串属性,在初始化过程中我将使该等特定子类的类名等于.然后干脆做一个
if([obj.klass isEqualTo:@"SomeClass"])
这会有益吗?
我试图尽可能多地保持游戏循环中的动态编码.
谢谢!
我做了一个简单的实验,我在Xcode中编写了以下代码:
int main(int argc, char** argv)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSApplication* app = [[NSApplication alloc] init];
NSWindow* window = [[NSWindow alloc]
initWithContentRect: NSMakeRect(0, 0, 640, 480)
styleMask: NSTitledWindowMask | NSMiniaturizableWindowMask
backing: NSBackingStoreBuffered
defer: NO];
[window setTitle: @"New Window"];
[window center];
[window makeKeyAndOrderFront:nil];
[app run];
[pool release];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它按预期运行,一个新的空窗口,但如果我使用命令行在终端下编译它:
$ g++ test.mm -framework Cocoa
$ ./a.out
Run Code Online (Sandbox Code Playgroud)
没有窗口,它会在[app run]轻而易举.
我做错了吗?为什么Xcode和命令行之间有不同的行为?有人能告诉我如何在命令行中实现相同的行为吗?
提前致谢.
我想使用OS X默认GUI(如NSImageView)来显示OS X应用程序(不是iOS)的OpenCV图像,所以我需要使用Objective C和C++,这对于Apple LLVM编译器来说并不是什么大问题.但是当谈到OpenCV时,即使只是将opencv2/opencv.hpp导入到'.mm'文件中也会导致构建崩溃.
我收到错误:"预期会员名称或';' 声明说明符后"在OpenCV utility.hpp行'中bool check()const;'.
我搜索了这个,我在这里有一个类似的问题(混合Objective-C和C++和OpenCV).这个问题是在Cocoa和OpenCV中定义的一些宏.答案是在'.pch'文件中的Cocoa头之前导入OpenCV头.
默认情况下,iOS模板具有".pch"文件,但OS X模板不具有".pch"文件.所以我添加一个'.pch'没有运气,它也不会编译.
所以我的问题是如何才能像iOS解决方案那样做同样的事情?如何使用OpenCV编译OS X?
可以在Objective-C++(.mm)文件中调用Swift代码吗?有没有简单的解决方法,如果没有?
我有一个Xcode项目,它是Swift,Objective-C和C++的混合体.我没有问题从Objective-C到Swift用-Bridging-Header.h或从Swift到Objective-C用-Swift.h.
但我有一个.mm文件,它是Objective-C++.当我尝试#import "[ProductName]-Swift.h"它时会在-Swift.h文件中抛出许多编译错误,例如:
找不到'NSApplicationDelegate'的协议声明,你的意思是'NSConnectionDelegate'吗?
没有名为'NSTableViewDataSource'的类型协议
等等...
我已经研究了其他几个类似的问题,例如我可以将Swift与C++混合使用吗?就像Objective - C .mm文件一样,它似乎没有给我一个明确的答案或解决方案.
在我看来,我目前的解决方法是在Objective-C中创建一个使用Swift代码然后将其导入Objective-C++代码的包装器对象.