未找到架构x86_64的符号(带有xcode的OpenGL)

时间:2017-01-23 21:08:59

标签: c++ xcode macos opengl

我是使用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
}

非常感谢任何帮助!

1 个答案:

答案 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()的声明中,但这是错误的方法。只需包含正确的标题。