莫非凉。 2022-12-31 17:20 采纳率: 40%
浏览 101
已结题

Mac环境下freeglut: failed to open display ''怎么解决?

背景:Mac m1环境,macOS Ventura 13.0.1系统,使用VScode,用cmake编译c++文件,使用OpenGL库

gcc 版本

(base) yuwenshuo@Cosmos-Computer build % gcc --version
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: arm64-apple-darwin22.1.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
遇到的现象:生成的执行文件HelloGL无法打开
o@Cosmos-Computer build % ./HelloGL 
freeglut (./HelloGL): failed to open display ''
具体main.cpp代码如下
#include<stdio.h>
#include<GLUT/glut.h>

void displayMe(void)
{
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_POLYGON);
        glVertex3f(0.5, 0.0, 0.5);
        glVertex3f(0.5, 0.0, 0.0);
        glVertex3f(0.0, 0.5, 0.0);
        glVertex3f(0.0, 0.0, 0.5);
        glEnd();
        glFlush();
}
int main(int argc, char** argv){
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE);
        glutInitWindowSize(400, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Hello world!");
        glutDisplayFunc(displayMe);
        glutMainLoop();
        //return 0;
}
编写的CmakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 3.0.0)
project(HelloGL VERSION 0.1.0)

# 使用 C++ 11 标准
set(CMAKE_CXX_STANDARD 11)

# 添加头文件
set(GLAD_H ${PROJECT_SOURCE_DIR}/include)
set(GLFW_H /opt/homebrew/Cellar/glfw/3.3.8/include)
set(GLUT_H /opt/homebrew/Cellar/freeglut/3.2.2/include)
include_directories(${GLAD_H} ${GLFW_H} ${GLUT_H})

# 添加目标链接
set(GLFW_LINK /opt/homebrew/Cellar/glfw/3.3.8/lib/libglfw.3.dylib)
set(GLUT_LINK /opt/homebrew/Cellar/freeglut/3.2.2/lib/libglut.3.dylib)
link_libraries(${GLFW_LINK} ${GLUT_LINK})

# 执行编译命令
set(SOURCES glad.c main.cpp)
add_executable(HelloGL ${SOURCES})

# 链接系统的 OpenGL 框架
if (APPLE)
    target_link_libraries(HelloGL "-framework OpenGL")
endif()

include(CTest)
enable_testing()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
我的解答思路和尝试过的方法:
(base) o@Cosmos-Computer build % export DISPLAY=localhost:1                         
(base) yuwenshuo@Cosmos-Computer build % ./HelloGL 
freeglut (./HelloGL): failed to open display 'localhost:1'
(base) o@Cosmos-Computer build % export DISPLAY=0                                      
(base) o@Cosmos-Computer build % ./HelloGL 
freeglut (./HelloGL): failed to open display '0'
(base) o@Cosmos-Computer build % export DISPLAY= 
(base) o@Cosmos-Computer build % ./HelloGL 
freeglut (./HelloGL): failed to open display ''

可见大概不是host的问题

我想要达到的结果:使用glut库编译出能绘制图形的窗口
  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2022-12-31 19:24
    关注

    首先,在 macOS 上,使用 GLUT 时应使用 #include<GLUT/glut.h> 而不是 #include<glut.h>。


    其次,你使用了 glutInitDisplayMode(GLUT_SINGLE),这将导致 GLUT 使用单缓冲模式,而不是双缓冲模式。在单缓冲模式下,当绘图函数调用 glFlush() 时,所有的绘图命令都会立即在单缓冲区上执行,而不是在双缓冲区上等待切换时再执行。这会导致你看不到任何图形,因为图形会立即消失。


    要解决这个问题,可以将 glutInitDisplayMode(GLUT_SINGLE) 替换为 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB),这样就会使用双缓冲模式,并且可以看到绘制的图形。


    还有一个问题是你使用了 glBegin(GL_POLYGON) 和 glEnd() 绘制多边形,但是你没有指定颜色。要解决这个问题,可以在绘图函数中调用 glColor3f(r, g, b) 设置颜色,其中 r, g, b 分别是红、绿、蓝三个颜色分量的值,取值范围为 0.0 ~ 1.0。


    修改后的代码如下:

    #include<GLUT/glut.h>
    
    void displayMe(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色
        glBegin(GL_POLYGON);
        glVertex3f(0.5, 0.0, 0.5);
        glVertex3f(0.5, 0.0, 0.0);
        glVertex3f(0.0, 0.5, 0.0);
        glVertex3f(0.0, 0.0, 0.5);
        glEnd();
        glFlush();
    }
    
    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 使用双缓冲模式
        glutInitWindowSize(400, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Hello world!");
        glutDisplayFunc(displayMe);
        glutMainLoop();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 修改了问题 1月1日
  • 修改了问题 1月1日
  • 展开全部

悬赏问题

  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上