2017-01-23 10 views
1

OpenGLの使用は非常に新しいです。実行しようとしているプログラムは私の教授が提供しているので、実際には書いていないので、プログラムを実行するのに問題があります。このプログラムは、黒い画面上に白い正方形を作ることを想定しています。私はMac Sierra 10.12.2を使用しています。また、私はすでに展開ターゲットを10.8に変更しました。これは、それ以降のものでコンパイルする際のエラーのためです。今私がビルドしてxcodeで実行しようとすると、2つのエラーが発生します。アーキテクチャx86_64(xcodeのOpenGL)のシンボル

これらのエラーを取得イムされ、今ここに

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

私は非常に教授がまだこのようなOpenGLを教えていることにうんざりしています。あなたは教授と一緒に座り、[彼らはレガシーOpenGLを教えるべきではない](http://gamedev.stackexchange.com/questions/34108/opengl-vbo-or-glbegin-glend)を思い起こさせ、 OpenGLの機能を2008年に廃止されていないものに変更しました。私はリンクした投稿からの大きな引用:「古いものを最初に学ぶ方がより簡単だと思う人もいると思う人もいます。放棄しなければなりません。 – Xirema

+0

参考までに、あなたが得ているエラーはリンクエラーの結果です。特に教授の 'exit'の使用に関係しています。何らかの形で、ビルドプロセスのどこかで、正しい実行可能ファイルにリンクするための正しいオブジェクトファイルを参照していません。私があなたの特定のビルド環境について何か知っていたら、より詳細な診断手順を回答として投稿したいと思います。 – Xirema

+0

2を教えたいという彼の推論。xは「教えるのがより良いし、4を学ぶのではなく4.xにしてより古いものを学ぶのが簡単だから」ということもあります。私はおそらく間違っているが、私はexit関数はGLUTライブラリの一部ではないと思うが、私は正直にはわからない。それは私が本当に助けてくれたものすべてについてのことです。助けてくれてありがとう! – csm60

答えて

0

あなたのソースファイルの先頭の近くに以下を追加する必要があります。

#include <stdlib.h> 

と、この行を削除します。

void exit(int) ; 

まず、あなたは常に取得するために、適切なシステムヘッダーを使用する必要がありますシステムライブラリ関数の宣言。これは、関数がどのようにリンクされているかに影響する重要な属性を宣言が持つことができるmacOSでは特に当てはまります。

しかし、このような属性の欠如は、この場合、実際にあなたを引きつけたものではありません。ここでの問題は、C++プログラムを構築していることです。 C++では、関数の引数型はシンボル名の一部です。引用したエラーメッセージでこれを見ることができます。しかし、exit()関数はC標準ライブラリの一部です。これはネイティブにC++インターフェイスではありません。そのシンボル名は_exitであり、引数の数やタイプは示されていません。

コードにはexit(int)に変換されるシンボルへの参照が組み込まれていますが、システムライブラリの実際のシンボルはただ_exitです。一致しないので、シンボルが見つからないリンカエラーが発生します。

stdlib.hヘッダーは、関数宣言をextern "C" { ... }にラップするように特別な注意を払い、C++変換単位に含まれています。 C++スタイルのシンボル名を使用するのではなく、代わりにCスタイルのシンボル名を使用するように、C++コンパイラに指示します。

extern "C"を自分のコードのexit()の宣言に入れて問題を解決することもできますが、それは間違ったアプローチです。適切なヘッダーだけを含めてください。

+0

素晴らしい感謝、私はそれを変更し、それは素晴らしい仕事をした!だから私はそれが適切な図書館を含まないことと関係があると知っていた時点でそれが奇妙であったということです。だから私はちょうどそれが動作するようになると#がそれを動作させるように#ライブラリを追加するライブラリを追加し始めた。終了するために 'q'または 'Q'を入力してから思ったので、入力ライブラリが必要でした。 – csm60

関連する問題