在 OpenGL 中使用 GTK2+ 时出现编译错误?

标签 c opengl gtk

我正在编写一个使用固定管道 OpenGL 和 FreeGLUT 的 C 程序。但是,我想使用像 GTK+ 这样的完整工具包而不是 FreeGLUT。我无法使用 GTK3+,因为它与旧的 OpenGL 代码不兼容,所以我想使用 GTK2+。

我找到了this link一个名为 simple.c 的示例程序:

#include <math.h>
#include <gtk/gtk.h>
#include <GL/gl.h>
#include <gtkgl/gtkglarea.h>

int init (GtkWidget *widget)
{
if (gtk_gl_area_make_current (GTK_GL_AREA(widget)))
  {
  glViewport(0,0, widget->allocation.width, widget->allocation.height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(0,100, 100,0, -1,1);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  }

return TRUE;
}

int draw (GtkWidget *widget, GdkEventExpose *event)
{
if (event->count > 0) return TRUE;

if (gtk_gl_area_make_current (GTK_GL_AREA(widget)))
  {
  glClearColor(0,0,0,1);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1,1,1);
  glBegin(GL_TRIANGLES);
  glVertex2f(10,10);
  glVertex2f(10,90);
  glVertex2f(90,90);
  glEnd();
  gtk_gl_area_swap_buffers (GTK_GL_AREA(widget));
  }

return TRUE;
}

int reshape (GtkWidget *widget, GdkEventConfigure *event)
{
if (gtk_gl_area_make_current (GTK_GL_AREA(widget)))
  glViewport(0,0, widget->allocation.width, widget->allocation.height);

return TRUE;
}

int main (int argc, char **argv)
{
GtkWidget *window, *glarea;

int attrlist[] = {
GDK_GL_RGBA,
GDK_GL_RED_SIZE,1,
GDK_GL_GREEN_SIZE,1,
GDK_GL_BLUE_SIZE,1,
GDK_GL_DOUBLEBUFFER,
GDK_GL_NONE };

gtk_init (&argc, &argv);
if (gdk_gl_query () == FALSE) return 0;

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(window), "Simple");
gtk_container_set_border_width (GTK_CONTAINER(window), 10);
g_signal_connect (window, "delete_event",
G_CALLBACK (gtk_main_quit), NULL);

/* You should always delete gtk_gl_area widgets before exit or else
   GLX contexts are left undeleted, this may cause problems (=core dump)
   in some systems.
   Destroy method of objects is not automatically called on exit.
   You need to manually enable this feature. Do gtk_quit_add_destroy()
   for all your top level windows unless you are certain that they get
   destroy signal by other means. */

gtk_quit_add_destroy (1, GTK_OBJECT(window));

glarea = GTK_WIDGET(gtk_gl_area_new (attrlist));
gtk_widget_set_size_request (GTK_WIDGET(glarea), 100, 100);

gtk_widget_set_events (GTK_WIDGET(glarea), GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);

g_signal_connect (glarea, "expose_event", G_CALLBACK(draw), NULL);
g_signal_connect (glarea, "configure_event", G_CALLBACK(reshape), NULL);
g_signal_connect (glarea, "realize", G_CALLBACK(init), NULL);

gtk_container_add (GTK_CONTAINER(window), GTK_WIDGET(glarea));
gtk_widget_show (GTK_WIDGET(glarea));
gtk_widget_show (GTK_WIDGET(window));

gtk_main ();
return 0;
}

但不幸的是它重新查询了一个我不知道从哪里获取的文件,gtk_opengl.h

我尝试使用

编译此 simple.c 代码失败
gcc simple.c -o helloworld `pkg-config --libs gtk+-2.0`

当然,出现了以下错误:

fatal error: gtk_opengl.h: No such file or directory

关于如何编译 simple.c 有什么想法吗?或者如何将 OpenGL 与 GTK2+ 结合起来?

最佳答案

在我的 Debian Stable 机器上,我必须安装 libgtkgl2.0-dev 并将 --cflagsgtkgl-2.0 添加到 pkg-config调用:

gcc simple.c -o helloworld `pkg-config --cflags --libs gtk+-2.0 gtkgl-2.0`

关于在 OpenGL 中使用 GTK2+ 时出现编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464834/

相关文章:

c - 我如何使用中断服务例程来检测此 MSP430 代码上的按钮事件?

c++ - firebreath npplugin 中的文件写入权限被拒绝

c++ - 混合使用 DirectX 和 OpenGL

opengl - GLFW - UBuntu 14.04 LTS 上的链接器错误

c++ - 在 wxGLCanvas 上调整大小之前无法初始化着色器

linux - 我可以为 Ubuntu 上的应用程序中的菜单项分配自定义键盘快捷键吗?

c - 如何获得足够大的 strcpy 目标字符串?

c - 如果你已经获得了 toUpper(),如何实现 toLower()

windows - Windows 7 下 GTK 中 gtk_widget_queue_draw 中的内存泄漏

c - GTk 每个小部件加速器