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

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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵