在没有 XCode 的情况下使用 CGL/NSOpenGL 在 OSX 上使用 OpenGL 的 C++ 代码?

Posted

技术标签:

【中文标题】在没有 XCode 的情况下使用 CGL/NSOpenGL 在 OSX 上使用 OpenGL 的 C++ 代码?【英文标题】:C++ code with OpenGL on OSX using CGL/NSOpenGL without XCode? 【发布时间】:2012-03-16 06:14:47 【问题描述】:

我想使用 CGL 或 NSOpenGL 在不使用 XCode 的情况下创建 OpenGL 窗口(使用命令行 gcc 编译)。我正在开发跨平台的东西,如果可以的话,我想将代码差异降到最低!我的代码库目前完全是 C++。这是可能吗?我是 OSX 新手,还没有接触过 Objective C。我查看了开发人员文档并获取了一些示例文件。他们都在使用xcode。我成功编译了源代码并链接到了正确的框架,但是整个应用程序包、xib 和 info.plist 似乎有点过头了。

【问题讨论】:

应该绝对可以。是全屏应用吗? 所以你让它作为一个普通的二进制文件工作,你只需要将它打包到一个 App 包中?为什么不使用 Xcode 制作该 App 包一次,然后让您的构建脚本仅替换二进制文件(并可能更新版本号)? @KrisVanBael 我编译了在这里找到的代码:developer.apple.com/library/mac/#samplecode/GLFullScreen/… 但它抱怨 xibs 和其他东西。我想我可以使用 xcode 来创建包,但它似乎有点 hackish @KrisVanBael 我会照你说的做一次构建应用程序包并替换二进制文件。你知道我如何将我的 c++ 代码与 obj-c 的东西联系起来吗?为响应干杯! 混合 c++ 和 obj C 是可能的。如果混合使用,请使用文件扩展名 .mm。 【参考方案1】:

这是最简单的:

// g++ glInfo.cpp -o glInfo.x -framework OpenGL 

#include <OpenGL/OpenGL.h>
#include <OpenGL/gl3.h>
#include <stdio.h>

int main(int argc, char **argv) 
 
    CGLContextObj     ctx; 
    CGLPixelFormatObj pix; 
    GLint             npix; 
    CGLPixelFormatAttribute attribs[] =  
        (CGLPixelFormatAttribute) 0
    ; 

    CGLChoosePixelFormat( attribs, &pix, &npix ); 
    CGLCreateContext( pix, NULL, &ctx ); 
    CGLSetCurrentContext( ctx ); 

    printf("Vendor:   %s\n", glGetString(GL_VENDOR)                  ); 
    printf("Renderer: %s\n", glGetString(GL_RENDERER)                ); 
    printf("Version:  %s\n", glGetString(GL_VERSION)                 ); 
    printf("GLSL:     %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); 

   return 0; 

【讨论】:

问题是,OP 想要创建一个“OpenGL 窗口”。 CGL 的公共接口不公开此功能。您必须使用 AGL(已弃用)或 NSOpenGL(Objective C)来完成此操作。 实际上,在 El Capitan 中,您可以使用 CGLSetFullScreenOnDisplay() 创建一个“OpenGL 窗口”。您不需要 AGL 或 NSOpenGLView。唯一的缺点是 CGL 只给你全屏窗口。【参考方案2】:

fltk 和 SDL 都应该有足够的 AGL/CGL 代码。我已经使用 fltk-1.3.0 在 OS X 上构建并运行了 cmdline GL 应用程序。然而,它使用了已弃用的 AGL 子系统。 SDL 为其 Quartz 视频层使用 CGL 和 NSOpenGL:./src/video/quartz

如果您需要构建src.m,请为编译器使用 obj-c 标志,并让本机 g++、llvm-g++、clang++ 或其他任何东西来处理链接。您可能需要添加-framework CGL -framework OpenGL 以及ApplicationServicesCocoa。很多答案取决于您所说的“代码分歧”。

【讨论】:

我将查看 SDL 代码。我试图远离碳!我在链接库时没有遇到任何问题。感谢您的帮助!【参考方案3】:

您可以在不使用 Xcode 的情况下构建应用程序,但是如果您希望不是系统管理员的用户使用它们,您将需要一个应用程序包(因此需要 .plist)和(除非它是一个游戏)一个用户界面OpenGL 提供了什么。您不需要为您的 UI 创建 .xib。您可以通过编程方式完成所有操作,尽管使用 .xibs 对于大多数事情来说要容易得多。您为什么不想使用旨在帮助您的工具?我并不是说它们是最好的,但它们仅使用命令行界面就胜过了。 (不过,一旦您的应用程序有了 Xcode 项目,您就可以从命令行构建它,甚至可以自动构建它。)

【讨论】:

我不知道一旦我有了 xcode 项目,我就可以从命令行自动构建应用程序!我在哪里可以找到更多相关信息?除了opengl里面的东西外,没有UI。我只是不想更新代码,然后每次都必须进入xcode进行构建。这是我最大的抱怨。你能给我一个关于如何让我的 c++ 代码与 obj-c 的东西很好地配合的线索吗?为响应欢呼! @mightcouldb1:这不是论坛。你问了一个问题,你得到了答案。您现在在问另一个问题,关于将 Objective C 与 C++ 混合。最好使用“”按钮完成此操作。 我同意 Nicol Bolas 的观点,您应该就此提出另一个问题。但是为了帮助您知道要问什么,您可以在xcodebuild 上查找信息。 BTW,如果我的回答对你有帮助,请勾选左边的绿色复选框! @NicolBolas 以后我会在别处问这些问题。对于那个很抱歉。您的 OpenGL 教程对我很有帮助,感谢您将它们放在一起。 @user1118321 感谢您的信息!我会检查 xcodebuild。【参考方案4】:

好吧,您可以“手动”完成(我曾经在 NeXTStep 时期这样做过),但在第一次工作之前会很痛苦。 XCode 在后台使用 makefile。您可以在

中找到并采用 makefile
  /Developer/Makefiles

(XCode 4.3 之前的版本) 或用于 XCode 4.3 中的

 /Applications/Xcode.app/Contents/Developer/Makefiles

祝你好运!

【讨论】:

我正在查看 /Developer/Makefiles/pb_makefiles,它看起来就像我正在寻找的东西!我无法找到第二条路径。我的 Xcode.app 文件位于 /Developer/ 中。我正在使用 OSX Lion。无论哪种方式,我都会继续查看这些 makefile。非常感谢!【参考方案5】:

对于构建系统,我推荐 CMake/CPack,这将帮助您保持跨平台并构建应用程序包。对于 NSGL,可以使用 Obj-C++,但我手头没有任何代码。

【讨论】:

我从未使用过 CMake,但我会看看它!感谢您的回复!

以上是关于在没有 XCode 的情况下使用 CGL/NSOpenGL 在 OSX 上使用 OpenGL 的 C++ 代码?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 5:在没有 XCode 的情况下模拟应用程序构建

在没有最新 Xcode 版本的情况下向 Apple 提交 App

在没有 XCode 的情况下使用 CGL/NSOpenGL 在 OSX 上使用 OpenGL 的 C++ 代码?

在没有 xcode 的情况下为 Apple Watch 创建一个应用程序

在没有 Xcode 的情况下启动 iPhone 模拟器

如何在没有注册 Apple 开发者计划的情况下使用 Xcode 8 在真实设备上运行应用程序?