Mac OpenGL的坑

OpenGL使用Bug

系统:MacOS 10.13.6
openGL 版本: 4.1 ATI-1.68.21
opengl 函数管理库:glew2.1.0
opengl 窗口库:glfw3.3
IDE:CLion 2018.1

编译时openGL 相关函数找不到

报错日志:

Undefined symbols for architecture x86_64:
  "_glClear", referenced from:
      _main in main.cpp.o
  "_glClearColor", referenced from:
      _main in main.cpp.o
  "_glGetString", referenced from:
      _main in main.cpp.o
  "_glViewport", referenced from:
      framebuffer_size_callback(GLFWwindow*, int, int) in main.cpp.o

报错的原因是代码中所有涉及到opengl函数调用的地方,都不被x86_64架构系统识别,这点在日志中写的很明白。
原因和解决方案:
学习的时候,代码参考网络博客,CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.10)
project(OpenGL)

# 添加头文件
set(CMAKE_CXX_STANDARD 11)
set(GLFW_H /usr/local/Cellar/glfw/3.3/include/GLFW)
set(GLEW_H /usr/local/Cellar/glew/2.1.0/include/GL)
include_directories(${GLFW_H} ${GLEW_H})

# 添加目标链接
set(GLFW_LINK /usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib)
set(GLEW_LINK /usr/local/Cellar/glew/2.1.0/lib/libGLEW.2.1.0.dylib)
link_libraries(${OPENGL} ${GLFW_LINK} ${GLEW_LINK})

# 执行编译命令
set(SOURCE_FILES main.cpp)
add_executable(OpenGL ${SOURCE_FILES})

其中${OPENGL}原本应该将系统的OpenGL相关库链接到项目中的,但这个写法可能在当前环境不支持。将这种写法换成"-framework OpenGL"即可。
替换后,完整的CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 3.10)
project(OpenGL)

# 添加头文件
set(CMAKE_CXX_STANDARD 11)
set(GLFW_H /usr/local/Cellar/glfw/3.3/include/GLFW)
set(GLEW_H /usr/local/Cellar/glew/2.1.0/include/GL)
include_directories(${GLFW_H} ${GLEW_H})

# 添加目标链接
set(GLFW_LINK /usr/local/Cellar/glfw/3.3/lib/libglfw.3.3.dylib)
set(GLEW_LINK /usr/local/Cellar/glew/2.1.0/lib/libGLEW.2.1.0.dylib)
link_libraries("-framework OpenGL" ${GLFW_LINK} ${GLEW_LINK})

# 执行编译命令
set(SOURCE_FILES main.cpp)
add_executable(OpenGL ${SOURCE_FILES})

运行时EXC_BAD_ACCESS

报错日志:

Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
Exception Codes:       KERN_INVALID_ADDRESS at 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Segmentation fault: 11
Termination Reason:    Namespace SIGNAL, Code 0xb
Terminating Process:   exc handler [0]

VM Regions Near 0:
--> 
    __TEXT                 00000001026c2000-00000001026c5000 [   12K] r-x/rwx SM=COW  
 [/Users/**/CLionProjects/OpenGL/cmake-build-debug/OpenGL]

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   ???                           	000000000000000000 0 + 0
1   OpenGL                        	0x00000001026c3d71 main + 465 (main.cpp:55)
2   libdyld.dylib                 	0x00007fff7efbd015 start + 1

main.cpp:55 这行的代码是:

unsigned int VBO;
glGenBuffers(1, &VBO); // main.cpp:55

原因和解决方案:

出现问题的客观原因是:在跟随教程你好,三角形练习时,教程中的代码并不完成适用于当前场景,可能是系统方面的原因。直接原因:教程的代码中,没有执行glewInit()函数,造成随后调用的OpenGL函数无法正确的找到对应函数,从而导致段错误。

来看看GLEW的官方解释:

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris.

OpenGL的使用,最基本的两个步骤是:

  1. 初始化OpenGL上下文:上下文环境用于记录所有OpenGL相关的状态,位于操作系统的某一个进程中,每个进程可以拥有多个上下文,每个上下文可以描述系统中的一个窗口。简单的说,就是在当前操作系统中创建一个窗口。
  2. 定位所有需要使用的OpenGL函数:因为OpenGL只是一个标准,具体的实现由显卡驱动厂商实现,但OpenGL驱动版本居多,无法在编译时制定。这个工作就只能转移到运行时,由开发者指定了。GLEW的作用就是在运行时,获取显卡驱动支持的函数,保存在对应的函数指针中供运行时调用。

所以,对应上述两个步骤,我们应该分别执行:

  1. glfwInit:以创建上下文。
  2. glewInit:以加载系统OpenGL函数。

所以,本次未捕获异常只需要在执行任何OpenGL函数调用之前,调用glewInit即可。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
要在Mac上配置OpenGL,请按照以下步骤进行操作: 1. 首先,确保您的Mac上安装了Xcode和XQuartz。您可以在Mac App Store中找到和安装Xcode,而XQuartz可以从其官方网站下载。 2. 打开Xcode,并创建一个新项目。在左侧面板中选择“Application”并选择“Command Line Tool”。 3. 在“Choose options for your new project”窗口中,选择“Language”为“C++”并选择“Type”为“OpenGL”。 4. 在“Choose a location for your new project”窗口中,选择将项目保存到您想要的位置。 5. 点击“Create”按钮,创建项目。 6. 在Xcode中,打开“Build Settings”选项卡,并找到“Search Paths”部分。在“Header Search Paths”中添加“/usr/local/include”,在“Library Search Paths”中添加“/usr/local/lib”。 7. 在同一选项卡中,找到“Linking”部分,并添加以下框架: - OpenGL.framework - GLUT.framework 8. 在Xcode中,打开“main.cpp”文件并添加以下代码: ``` #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5,-0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow("OpenGL on Mac"); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 9. 点击“Build and Run”按钮,您应该可以看到一个简单的OpenGL窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值