在没有 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
以及ApplicationServices
和Cocoa
。很多答案取决于您所说的“代码分歧”。
【讨论】:
我将查看 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++ 代码?