OpenGL-код работает в Windows, но не в Mac

Моя школа использует компьютеры с Windows, но у меня есть только домашний компьютер. Код отлично работает в Windows, но по какой-то причине я получаю ошибки, выполняемые в xCode. Я не был уверен, какие рамки включить, поэтому я добавил GLKit, Cocoa, GLUT и OpenGL. Я что-то упускаю?? Я хотел бы получить настройку Xcode, чтобы я мог работать над домашним заданием с тем же кодом, который будет работать на окнах. Вот код

#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#define GL_GLEXT_PROTOTYPES
#ifdef __APPLE__
 #include <glut glut.h="">
#else
 #include <gl glut.h="">
#endif

#define GLUT_KEY_ESCAPE 27

const GLsizei windowWidth = 500;
const GLsizei windowHeight = 500;

GLfloat cubeRotateX = 45.0f;
GLfloat cubeRotateY = 45.0f;
bool keys[255];

GLvoid establishProjectionMatrix(GLsizei width, GLsizei height)
{
 glViewport(0, 0, width, height);

 glMatrixMode(GL_PROJECTION);

 glLoadIdentity();

 gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 200.0f);
}

GLvoid initGL(GLsizei width, GLsizei height)
{
 establishProjectionMatrix(width, height);

 glShadeModel(GL_SMOOTH);

 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

 glEnable(GL_DEPTH_TEST);
 glDepthFunc(GL_LEQUAL);

 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
 glEnable(GL_PERSPECTIVE_CORRECTION_HINT);
}

GLvoid displayFPS(GLvoid)
{
 static long lastTime = glutGet(GLUT_ELAPSED_TIME);
 static int loops = 0;
 static GLfloat fps = 0.0f;

 int newTime = glutGet(GLUT_ELAPSED_TIME);

 if (newTime - lastTime > 100)
 {
 float newFPS = (float)loops / float(newTime - lastTime) * 1000.0f;
 fps = (fps + newFPS) / 2.0f;

 char title[80];
 sprintf_s(title, "OpenGL Demo - %.2f", fps);
 glutSetWindowTitle(title);

 lastTime = newTime;
 loops = 0;
 }
 loops++;
}

GLvoid drawScene(GLvoid)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

 glTranslatef(0, 0, -5.0f);
 glRotatef(cubeRotateX, 1.0, 0.0, 0.0);
 glRotatef(cubeRotateY, 0.0, 1.0, 0.0);

 glBegin(GL_QUADS);
 glColor3f(0.0f, 1.0f, 1.0f);
 glVertex3f( 1.0f, 1.0f, -1.0f);
 glVertex3f(-1.0f, 1.0f, -1.0f);
 glVertex3f(-1.0f, 1.0f, 1.0f);
 glVertex3f( 1.0f, 1.0f, 1.0f);

 glColor3f(0.0f, 1.0f, 0.0f);
 glVertex3f( 1.0f, -1.0f, -1.0f);
 glVertex3f(-1.0f, -1.0f, -1.0f);
 glVertex3f(-1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f, 1.0f);

 glColor3f(1.0f, 0.0f, 0.0f);
 glVertex3f( 1.0f, 1.0f, 1.0f);
 glVertex3f(-1.0f, 1.0f, 1.0f);
 glVertex3f(-1.0f, -1.0f, 1.0f);
 glVertex3f( 1.0f, -1.0f, 1.0f);

 glColor3f(1.0f, 1.0f, 0.0f);
 glVertex3f( 1.0f, 1.0f, -1.0f);
 glVertex3f(-1.0f, 1.0f, -1.0f);
 glVertex3f(-1.0f, -1.0f, -1.0f);
 glVertex3f( 1.0f, -1.0f, -1.0f);

 glColor3f(0.0f, 0.0f, 1.0f);
 glVertex3f(-1.0f, 1.0f, 1.0f);
 glVertex3f(-1.0f, 1.0f, -1.0f);
 glVertex3f(-1.0f, -1.0f, -1.0f);
 glVertex3f(-1.0f, -1.0f, 1.0f);

 glColor3f(1.0f, 0.0f, 1.0f);
 glVertex3f( 1.0f, 1.0f, 1.0f);
 glVertex3f( 1.0f, 1.0f, -1.0f);
 glVertex3f( 1.0f, -1.0f, -1.0f);
 glVertex3f( 1.0f, -1.0f, 1.0f);
 glEnd();

 glFlush();

 glutSwapBuffers();

 displayFPS();
}
GLboolean checkKeys(GLvoid)
{
 const GLfloat speed = 1.0f;

 if ( keys[GLUT_KEY_ESCAPE] )
 return true;

 if (keys[GLUT_KEY_LEFT])
 cubeRotateY -= speed;
 if (keys[GLUT_KEY_RIGHT])
 cubeRotateY += speed;
 if (keys[GLUT_KEY_UP])
 cubeRotateX -= speed;
 if (keys[GLUT_KEY_DOWN])
 cubeRotateX += speed;

 return false;
}
GLvoid timerLoop(int value)
{
 if (checkKeys())
 exit(0);
 glutPostRedisplay();

 glutTimerFunc(1, timerLoop, 0);
}



GLvoid keyboardCB(unsigned char key, int x, int y)
{
 keys[key] = true;
}
GLvoid keyboardUpCB(unsigned char key, int x, int y)
{
 keys[key] = false;
}
GLvoid keyboardSpecialCB(int key, int x, int y)
{
 keys[key] = true;
}
GLvoid keyboardSpecialUpCB(int key, int x, int y)
{
 keys[key] = false;
}




int main(int argc, char** argv)
{
 glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_DOUBLE);

 int windowID = glutCreateWindow("OpenGL Cube Demo");
 glutReshapeWindow(windowWidth, windowHeight);

 initGL(windowWidth, windowHeight);

 glutDisplayFunc(drawScene);

 glutKeyboardFunc(keyboardCB);
 glutKeyboardUpFunc(keyboardUpCB);
 glutSpecialFunc(keyboardSpecialCB);
 glutSpecialUpFunc(keyboardSpecialUpCB);

 glutTimerFunc(1, timerLoop, 0);

 glutMainLoop();
 return 0;

}
</gl></glut></math.h></stdarg.h></stdio.h>

Почему это работает в visual studio, а не в Xcode??

1 ответ

Ошибки компилятора кажутся довольно ясными. Поверхностная причина, по которой это не работает, состоит в том, что этот код содержит Windows-isms, которые не переносимы.

  • C++ не позволяет typedef of void указывать пустой список параметров. Вы должны использовать void. Итак, просто изменили эти GLvoid на void s.

  • sprintf_s() - это функция, специфичная для Windows. Вы можете заменить его на snprintf(), но вам нужно добавить параметр после буфера, размер буфера. Итак, замените это:

    sprintf_s(title, ...);

    с:

    snprintf(title, sizeof(title), ...);
  • Функция exit() доступна кросс-платформенной, но вы должны включить правый заголовок. Добавьте #include в верхней части файла.

licensed under cc by-sa 3.0 with attribution.