gpt4 book ai didi

c++ - 找不到体系结构 x86_64 的符号(带有 xcode 的 OpenGL)

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:52 28 4
gpt4 key购买 nike

我对使用 OpenGL 还很陌生。我尝试运行的程序是由我的教授提供的,所以我实际上并没有编写任何程序,我在运行程序时遇到了问题。该程序假设只是在黑色屏幕上制作一个白色方 block 。我正在使用 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
}

如有任何帮助,我们将不胜感激!

最佳答案

您需要在源文件顶部附近添加以下内容:

 #include <stdlib.h>

并删除这一行:

void exit(int) ;

首先,您应该始终使用正确的系统头文件来获取系统库函数的声明。在 macOS 上尤其如此,其中声明可以具有影响函数链接方式的重要属性。

但是,在这种情况下,缺少此类属性并不是真正让您感到困惑的原因。这里的问题是您正在构建 C++ 程序。在 C++ 中,函数的参数类型是其符号名称的一部分。您可以在引用的错误消息中看到这一点。但是 exit() 函数是 C 标准库的一部分。它本身不是 C++ 接口(interface)。它的符号名称是 _exit,没有指示其参数计数或类型。

您的代码包含对转换为 exit(int) 的符号的引用,而系统库中的实际符号只是 _exit。它们不匹配,因此您会收到未找到符号的链接器错误。

当 stdlib.h 头文件包含在 C++ 翻译单元中时,它会特别注意将其函数声明包装在 extern "C"{ ... } 中。因此,包含该 header 以获取声明会告诉 C++ 编译器不要使用 C++ 风格的符号名称,而是只使用 C 风格的符号名称。

您也可以通过将 extern "C" 放在您自己代码中的 exit() 声明中来“解决”这个问题,但这是错误的方法。只需包含正确的 header 即可。

关于c++ - 找不到体系结构 x86_64 的符号(带有 xcode 的 OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41815658/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com