2010-04-04 5 views
2

Snow Leopard 64 비트에서 netbeans 6.8을 사용하여 C++ opengl + sdl 응용 프로그램을 올바르게 컴파일하려고합니다.mac, netbeans 6.8, C++, sdl, opengl : 컴파일 문제

나는 macports를 사용하여 libSDL 1.2.14를 설치했습니다.

내가 컴파일하려고 스크립트는 다음

C++ 컴파일러 : 넷빈즈 프로젝트 속성에서

#ifdef WIN32 
#define WIN32_LEAN_AND_MEAN 
#include <windows.h> 
#endif 
#if defined(__APPLE__) && defined(__MACH__) 
#include <OpenGL/gl.h> // Header File For The OpenGL32 Library 
#include <OpenGL/glu.h> // Header File For The GLu32 Library 
#else 
#include <GL/gl.h> // Header File For The OpenGL32 Library 
#include <GL/glu.h> // Header File For The GLu32 Library 
#endif 
#include "sdl/SDL.h" 
#include <stdio.h> 
#include <unistd.h> 
#include "SDL/SDL_main.h" 

SDL_Surface *screen=NULL; 

GLfloat  rtri;      // Angle For The Triangle (NEW) 
GLfloat  rquad;      // Angle For The Quad  (NEW) 


void InitGL(int Width, int Height)   // We call this right after our OpenGL window is created. 
{ 
glViewport(0, 0, Width, Height); 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);  // This Will Clear The Background Color To Black 
glClearDepth(1.0);    // Enables Clearing Of The Depth Buffer 
glDepthFunc(GL_LESS);    // The Type Of Depth Test To Do 
glEnable(GL_DEPTH_TEST);   // Enables Depth Testing 
glShadeModel(GL_SMOOTH);   // Enables Smooth Color Shading 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity();    // Reset The Projection Matrix 

gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window 

glMatrixMode(GL_MODELVIEW); 
} 

/* The main drawing function. */ 
int DrawGLScene() 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  // Clear The Screen And The Depth Buffer 
glLoadIdentity();    // Reset The View 

glTranslatef(-1.5f,0.0f,-6.0f);  // Move Left 1.5 Units And Into The Screen 6.0 
glRotatef(rtri,0.0f,1.0f,0.0f);    // Rotate The Triangle On The Y axis (NEW) 

// draw a triangle 
    glBegin(GL_TRIANGLES);     // Begin Drawing Triangles 
glColor3f(1.0f,0.0f,0.0f);   // Red 
glVertex3f(0.0f, 1.0f, 0.0f);   // Top Of Triangle (Front) 
glColor3f(0.0f,1.0f,0.0f);   // Green 
glVertex3f(-1.0f,-1.0f, 1.0f);   // Left Of Triangle (Front) 
glColor3f(0.0f,0.0f,1.0f);   // Blue 
glVertex3f(1.0f,-1.0f, 1.0f);   // Right Of Triangle (Front) 
glColor3f(1.0f,0.0f,0.0f);   // Red 
glVertex3f(0.0f, 1.0f, 0.0f);   // Top Of Triangle (Right) 
glColor3f(0.0f,0.0f,1.0f);   // Blue 
glVertex3f(1.0f,-1.0f, 1.0f);   // Left Of Triangle (Right) 
glColor3f(0.0f,1.0f,0.0f);   // Green 
glVertex3f(1.0f,-1.0f, -1.0f);   // Right Of Triangle (Right) 
glColor3f(1.0f,0.0f,0.0f);   // Red 
glVertex3f(0.0f, 1.0f, 0.0f);   // Top Of Triangle (Back) 
glColor3f(0.0f,1.0f,0.0f);   // Green 
glVertex3f(1.0f,-1.0f, -1.0f);   // Left Of Triangle (Back) 
glColor3f(0.0f,0.0f,1.0f);   // Blue 
glVertex3f(-1.0f,-1.0f, -1.0f);   // Right Of Triangle (Back) 
glColor3f(1.0f,0.0f,0.0f);   // Red 
glVertex3f(0.0f, 1.0f, 0.0f);   // Top Of Triangle (Left) 
glColor3f(0.0f,0.0f,1.0f);   // Blue 
glVertex3f(-1.0f,-1.0f,-1.0f);   // Left Of Triangle (Left) 
glColor3f(0.0f,1.0f,0.0f);   // Green 
glVertex3f(-1.0f,-1.0f, 1.0f);   // Right Of Triangle (Left) 
glEnd(); 
glLoadIdentity();     // Reset The Current Modelview Matrix 
glTranslatef(1.5f,0.0f,-7.0f);    // Move Right 1.5 Units And Into The Screen 6.0 
glRotatef(rquad,1.0f,0.0f,0.0f);   // Rotate The Quad On The X axis (NEW) 
glBegin(GL_QUADS);     // Start Drawing Quads 
glColor3f(0.0f,1.0f,0.0f);   // Set The Color To Green 
glVertex3f(1.0f, 1.0f,-1.0f);   // Top Right Of The Quad (Top) 
glVertex3f(-1.0f, 1.0f,-1.0f);   // Top Left Of The Quad (Top) 
glVertex3f(-1.0f, 1.0f, 1.0f);   // Bottom Left Of The Quad (Top) 
glVertex3f(1.0f, 1.0f, 1.0f);   // Bottom Right Of The Quad (Top) 
glColor3f(1.0f,0.5f,0.0f);   // Set The Color To Orange 
glVertex3f(1.0f,-1.0f, 1.0f);   // Top Right Of The Quad (Bottom) 
glVertex3f(-1.0f,-1.0f, 1.0f);   // Top Left Of The Quad (Bottom) 
glVertex3f(-1.0f,-1.0f,-1.0f);   // Bottom Left Of The Quad (Bottom) 
glVertex3f(1.0f,-1.0f,-1.0f);   // Bottom Right Of The Quad (Bottom) 
glColor3f(1.0f,0.0f,0.0f);   // Set The Color To Red 
glVertex3f(1.0f, 1.0f, 1.0f);   // Top Right Of The Quad (Front) 
glVertex3f(-1.0f, 1.0f, 1.0f);   // Top Left Of The Quad (Front) 
glVertex3f(-1.0f,-1.0f, 1.0f);   // Bottom Left Of The Quad (Front) 
glVertex3f(1.0f,-1.0f, 1.0f);   // Bottom Right Of The Quad (Front) 
glColor3f(1.0f,1.0f,0.0f);   // Set The Color To Yellow 
glVertex3f(1.0f,-1.0f,-1.0f);   // Bottom Left Of The Quad (Back) 
glVertex3f(-1.0f,-1.0f,-1.0f);   // Bottom Right Of The Quad (Back) 
glVertex3f(-1.0f, 1.0f,-1.0f);   // Top Right Of The Quad (Back) 
glVertex3f(1.0f, 1.0f,-1.0f);   // Top Left Of The Quad (Back) 

glColor3f(0.0f,0.0f,1.0f);   // Set The Color To Blue 
glVertex3f(-1.0f, 1.0f, 1.0f);   // Top Right Of The Quad (Left) 
glVertex3f(-1.0f, 1.0f,-1.0f);   // Top Left Of The Quad (Left) 
glVertex3f(-1.0f,-1.0f,-1.0f);   // Bottom Left Of The Quad (Left) 
glVertex3f(-1.0f,-1.0f, 1.0f);   // Bottom Right Of The Quad (Left) 
glColor3f(1.0f,0.0f,1.0f);   // Set The Color To Violet 
glVertex3f(1.0f, 1.0f,-1.0f);   // Top Right Of The Quad (Right) 
glVertex3f(1.0f, 1.0f, 1.0f);   // Top Left Of The Quad (Right) 
glVertex3f(1.0f,-1.0f, 1.0f);   // Bottom Left Of The Quad (Right) 
glVertex3f(1.0f,-1.0f,-1.0f);   // Bottom Right Of The Quad (Right) 

glEnd();      // Done Drawing A Quad 
rtri+=0.02f;      // Increase The Rotation Variable For The Triangle (NEW) 
rquad-=0.015f;      // Decrease The Rotation Variable For The Quad  (NEW) 


// swap buffers to display, since we're double buffered. 
SDL_GL_SwapBuffers(); 
return true; 
} 


int main(int argc,char* argv[]) 
{ 
int done; 
/*variable to hold the file name of the image to be loaded 
*In real world error handling code would precede this 
*/ 

/* Initialize SDL for video output */ 
if (SDL_Init(SDL_INIT_VIDEO) < 0) { 
    fprintf(stderr, "Unable to initialize SDL: %s\n", SDL_GetError()); 
    exit(1); 
} 

atexit(SDL_Quit); 

/* Create a 640x480 OpenGL screen */ 
if (SDL_SetVideoMode(640, 480, 0, SDL_OPENGL) == NULL) { 
    fprintf(stderr, "Unable to create OpenGL screen: %s\n", SDL_GetError()); 
    SDL_Quit(); 
    exit(2); 
} 
SDL_WM_SetCaption("another example",NULL); 
InitGL(640,480); 
done=0; 
while (! done) { 
    DrawGLScene(); 
    SDL_Event event; 
    while (SDL_PollEvent(&event)) { 
     if (event.type == SDL_QUIT) { 
      done = 1; 
     } 
     if (event.type == SDL_KEYDOWN) { 
      if (event.key.keysym.sym == SDLK_ESCAPE) { 
       done = 1; 
      } 
     } 
    } 
} 
} 

나는 다음과 같은 구성이 포함 디렉토리에 /usr/X11/include/opt/local/include을 추가했다. 내가 unknown reference to _main

다음 오류가 발생했습니다 프로젝트에 SDL_main.h 및 libSDLMain.a를 포함하기 전에 ... 이제

/usr/X11/lib/libGL.dylib 
/usr/X11/lib/libGLU.dylib 
/opt/local/lib/libSDL.dylib 
/opt/local/lib/libSDLmain.a 

여기 읽기 : 링커 : 나는 다음과 같은 라이브러리를 추가 http://www.libsdl.org/faq.php?action=listentries&category=7#55

SDL_Main.h를 포함하고 libSDLMain.so를 내 프로젝트에 연결해야합니다.

이렇게하면 프로젝트가 컴파일되지 않습니다. 이것은 Netbeans 출력입니다.

/usr/bin/make -f nbproject/Makefile-Debug.mk SUBPROJECTS= .clean-conf 

rm -f -r build/Debug 

rm -f dist/Debug/GNU-MacOSX/opengl2 

CLEAN SUCCESSFUL (total time: 79ms) 


/usr/bin/make -f nbproject/Makefile-Debug.mk SUBPROJECTS= .build-conf 

/usr/bin/make -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/opengl2 

mkdir -p build/Debug/GNU-MacOSX 

rm -f build/Debug/GNU-MacOSX/main.o.d 

g++ -c -g -I/usr/X11/include -I/opt/local/include -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp 

mkdir -p dist/Debug/GNU-MacOSX 

g++  -o dist/Debug/GNU-MacOSX/opengl2 build/Debug/GNU-MacOSX/main.o /opt/local/lib/libIL.dylib /opt/local/lib/libILU.dylib /opt/local/lib/libILUT.dylib /usr/X11/lib/libGL.dylib /usr/X11/lib/libGLU.dylib /opt/local/lib/libSDL.dylib /opt/local/lib/libSDLmain.a 

Undefined symbols: 

"_OBJC_CLASS_$_NSMenu", referenced from: 
    [email protected] in libSDLmain.a(SDLMain.o) 
"__objc_empty_cache", referenced from: 
    _OBJC_METACLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
    _OBJC_CLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
"_CFBundleGetMainBundle", referenced from: 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
"_CFURLGetFileSystemRepresentation", referenced from: 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
"_NSApp", referenced from: 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSProcessInfo", referenced from: 
    [email protected] in libSDLmain.a(SDLMain.o) 
"_CFURLCreateCopyDeletingLastPathComponent", referenced from: 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
"_NSAllocateMemoryPages", referenced from: 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
"___CFConstantStringClassReference", referenced from: 
    cfstring=CFBundleName in libSDLmain.a(SDLMain.o) 
    cfstring= in libSDLmain.a(SDLMain.o) 
    cfstring=About in libSDLmain.a(SDLMain.o) 
    cfstring=Hide in libSDLmain.a(SDLMain.o) 
    cfstring=h in libSDLmain.a(SDLMain.o) 
    cfstring=Hide Others in libSDLmain.a(SDLMain.o) 
    cfstring=Show All in libSDLmain.a(SDLMain.o) 
    cfstring=Quit in libSDLmain.a(SDLMain.o) 
    cfstring=q in libSDLmain.a(SDLMain.o) 
    cfstring=Window in libSDLmain.a(SDLMain.o) 
    cfstring=m in libSDLmain.a(SDLMain.o) 
    cfstring=Minimize in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSAutoreleasePool", referenced from: 
    [email protected] in libSDLmain.a(SDLMain.o) 
"_CPSEnableForegroundOperation", referenced from: 
    _main in libSDLmain.a(SDLMain.o) 
"_CPSGetCurrentProcess", referenced from: 
    _main in libSDLmain.a(SDLMain.o) 
"_CFBundleCopyBundleURL", referenced from: 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
"_NSDeallocateMemoryPages", referenced from: 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSApplication", referenced from: 
    l_OBJC_$_CATEGORY_NSApplication_$_SDLApplication in libSDLmain.a(SDLMain.o) 
    [email protected] in libSDLmain.a(SDLMain.o) 
"_CPSSetFrontProcess", referenced from: 
    _main in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSString", referenced from: 
    l_OBJC_$_CATEGORY_NSString_$_ReplaceSubString in libSDLmain.a(SDLMain.o) 
    [email protected] in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSObject", referenced from: 
    _OBJC_CLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
"_CFBundleGetInfoDictionary", referenced from: 
    _main in libSDLmain.a(SDLMain.o) 
"_CFRelease", referenced from: 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
    -[SDLMain setupWorkingDirectory:] in libSDLmain.a(SDLMain.o) 
"__objc_empty_vtable", referenced from: 
    _OBJC_METACLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
    _OBJC_CLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
"_OBJC_CLASS_$_NSMenuItem", referenced from: 
    [email protected] in libSDLmain.a(SDLMain.o) 
"_objc_msgSend", referenced from: 
    -[SDLMain application:openFile:] in libSDLmain.a(SDLMain.o) 
    -[SDLMain applicationDidFinishLaunching:] in libSDLmain.a(SDLMain.o) 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
    -[NSString(ReplaceSubString) stringByReplacingRange:with:] in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
    _main in libSDLmain.a(SDLMain.o) 
"_OBJC_METACLASS_$_NSObject", referenced from: 
    _OBJC_METACLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
    _OBJC_METACLASS_$_SDLMain in libSDLmain.a(SDLMain.o) 
"_objc_msgSend_fixup", referenced from: 
    l_objc_msgSend_fixup_objectForKey_ in libSDLmain.a(SDLMain.o) 
    l_objc_msgSend_fixup_length in libSDLmain.a(SDLMain.o) 
    l_objc_msgSend_fixup_alloc in libSDLmain.a(SDLMain.o) 
    l_objc_msgSend_fixup_release in libSDLmain.a(SDLMain.o) 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[2]: *** [dist/Debug/GNU-MacOSX/opengl2] Error 1 
make[1]: *** [.build-conf] Error 2 
make: *** [.build-impl] Error 2 
BUILD FAILED (exit value 2, total time: 263ms) 

아이디어가 있습니까?

감사합니다.

+1

문제의 해결책을 찾으셨습니까? '_objc_msgSend_fixup'을 찾을 수 없다는 링크 오류가 있습니다. – ashen

답변

0

은 왜 같이 PKG-설정을 사용하려고 해달라고 : 'PKG-설정 --cflags --libs SDL'(.이는 악센트해야되는 거지되지만 그이 대답에서 제거) 장소 출력 GNU-MacOSX/opengl2 빌드/디버그/GNU-MacOSX/main.o 'pkg-config --cflags --libs ilut' 'pkg-config --cflags --libs glu ''pkg-config --cflags --libs sdl '

(' '을 대체하십시오) ilut 이름 지정 규칙에 대해 확실하지 않습니다. 마지막에 -framework OpenGL을 추가해야 할 수도 있고 없을 수도 있습니다. (늦은 답변 = 죄송합니다 = p)

+0

나는 왜 내가 -1인지 궁금해. 이것은 효과가있다. = '( – hackdev

2

"-framework Cocoa"를 컴파일러의 명령 줄에 추가하십시오.