首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在objC头中加入一行C++

在objC头中加入一行C++
EN

Stack Overflow用户
提问于 2017-09-26 19:02:31
回答 1查看 69关注 0票数 1

我正在使用Syphon框架为客户端提供视频帧。我需要使用一行代码来通过服务器为框架服务,而我只能尝试将其写入我的c++代码中。

Syphon文档这里给出了这个示例:

代码语言:javascript
复制
[myServer publishFrameTexture:myTex textureTarget:GL_TEXTURE_RECTANGLE_EXT imageRegion:NSMakeRect(0, 0, width, height) textureDimensions:NSMakeSize(width, height) flipped:NO];

我如何将它合并到我的c++头中?我已经设置了xcode编译器标志,以便将“其他C标志”设置为"-x目标-c“,将”其他C++标志“设置为"-x目标-c++”。

为了给出一些上下文,我的代码的其余部分现在看起来如下(以及它构建):

代码语言:javascript
复制
class OpencvMat2Syphon {

    // hack to call glut to create opengl context (one only so they don't wipe out each other)
    static bool haveGLContext;
    uint texId;
    CGLContextObj ctx;
    static SyphonServer *syphonServer;

public:

    OpencvMat2Syphon() {

        if (!haveGLContext) {
            char* str[1];  // glut hack for faking passing CLI parameters from main
            int argc = 1;
            str[0] = "app";
            glutInit(&argc, str);
            glutCreateWindow("imageGrabber");
            glutDisplayFunc([]{});
            glutHideWindow();
            haveGLContext = true;
        }

        ctx = CGLGetCurrentContext();
        std::cout << "cgl context: " << ctx << std::endl;
        SyphonServer *syphonServer = [[SyphonServer alloc] initWithName:@"imageGrabberOutput" context:ctx options:nil];

        glGenTextures(1, &texId);

        glBindTexture(GL_TEXTURE_2D, texId);
        glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
        glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    }

    ~OpencvMat2Syphon() {
        glDeleteTextures(1, &texId);
    }

    uint getTexId() {
        return texId;
    }

    void uploadTexture(cv::Mat mat) {

        glBindTexture(GL_TEXTURE_2D, texId);
        // can do swizzling/channel-flipping here? see https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, mat.cols, mat.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, mat.data);


// ??            [syphonServer publishFrameTexture:texId textureTarget:GL_TEXTURE_2D imageRegion:NSMakeRect(0, 0, 1280, 720) textureDimensions:NSMakeSize(1280, 720) flipped:NO];

    }
};

bool OpencvMat2Syphon::haveGLContext = false;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-26 21:01:28

你能把它算出来吗?一个非常简单的方法是:

  • 编写一个具有执行syphonServer调用的普通C签名的函数;
  • 将该函数的声明放入一个普通的C头文件;
  • 将该函数的实现放入包含头的目标-C文件中;
  • 从C++类调用C函数。

如果您可以将包含头的文件重命名为.mm,那么这也将达到预期的结果,即说服编译器将您的文件(以及它的头)视为目标-C++。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46433979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档