我是使用OpenGL的新手。我试图运行的程序是由我的教授提供的,所以我实际上没有编写任何程序,我在运行程序时遇到问题。该程序假设只是在黑色屏幕上制作一个白色方块。我正在使用mac Sierra 10.12.2。此外,我已经将部署目标更改为10.8,因为在此之后编译时出现的错误。现在,当我尝试构建并运行xcode时,我得到了2个错误。
这些是我得到的错误,
Undefined symbols for architecture x86_64:
"exit(int)", referenced from:
myKeyboard(unsigned char, int, int) in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
现在这里的代码与我尝试编译的完全一样。
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
const int screenHeight = 480; // window height is 480
const int screenWidth = 640 ; //window width is 640
// <<<<<<<<<<<<<<<<<<<<< Prototypes >>>>>>>>>>>>>>>>>>
void exit(int) ;
// <<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>
void myInit(void)
{
glClearColor(1.0,1.0,1.0,0.0); // set white background color
glColor3f(0.0f, 0.0f, 0.0f); // set the drawing color
glPointSize(4.0); // a ?dot? is 4 by 4 pixels
glLineWidth(4.0); // a ?dot? is 4 by 4 pixels
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
// <<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT); // clear the screen
glBegin(GL_POINTS);
// glBegin(GL_LINE_STRIP) ;
// glBegin(GL_LINE_LOOP) ;
// glBegin(GL_POLYGON);
glVertex2i(289, 190); // Dubhe
glVertex2i(320, 128) ; // Merak
glVertex2i(239, 67) ; // Phecda
glVertex2i(194, 101) ; // Megrez
glVertex2i(129, 83) ; // Alioth
glVertex2i(75, 73) ; // Mizar
glVertex2i(74, 74) ; // Alcor
glEnd();
glFlush(); // send all output to display
}
// <<<<<<<<<<<<<<<<<<<<<<<< myKeyboard >>>>>>>>>>>>>>
void myKeyboard(unsigned char theKey, int mouseX, int mouseY)
{
switch(theKey)
{
case 'Q':
case 'q':
exit(-1); //terminate the program
default:
break; // do nothing
}
}
// <<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
int main(int argc, char** argv)
{
glutInit(&argc, argv); // initialize the toolkit
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // set display mode
glutInitWindowSize(640, 480); // set window size
glutInitWindowPosition(100, 150); // set window position on screen
glutCreateWindow("Big Deep - Type Q or q to quit") ; // open the screen window
glutDisplayFunc(myDisplay); // register redraw function
glutKeyboardFunc(myKeyboard); // register the keyboard action function
myInit();
glutMainLoop(); // go into a perpetual loop
}
非常感谢任何帮助!
答案 0 :(得分:0)
您需要在源文件顶部附近添加以下内容:
#include <stdlib.h>
并删除此行:
void exit(int) ;
首先,您应该始终使用正确的系统头来获取系统库函数的声明。在macOS上尤其如此,声明可能具有影响函数链接方式的重要属性。
然而,在这种情况下,缺乏这样的属性并不是真正让你失望的原因。这里的问题是你正在构建一个C ++程序。在C ++中,函数的参数类型是其符号名称的一部分。您可以在引用的错误消息中看到此消息。但exit()
函数是C标准库的一部分。它本身不是C ++接口。它的符号名称是_exit
,没有指示其参数计数或类型。
您的代码已将对符号的引用合并到exit(int)
,而系统库中的实际符号仅为_exit
。它们不匹配,因此您会收到符号未找到的链接器错误。
当它包含在C ++转换单元中时,stdlib.h标头需要特别注意它在extern "C" { ... }
中包装它的函数声明。因此,包括获取声明的头文件告诉C ++编译器不要使用C ++样式的符号名称,而只是使用C样式的符号名称。
你也可以&#34;解决&#34;问题是将extern "C"
放在您自己的代码中exit()
的声明中,但这是错误的方法。只需包含正确的标题。