2013-03-10 50 views
4

我想在wax上使用waf在osx上構建一個C++ opengl程序,但無法讓它正常工作。如何在osx上使用waf連接opengl和glut?

g++ main.cpp -framework GLUT -framework OpenGL 

我用下面的WScript:

通常當我編譯一個OpenGL程序我在終端使用這個

top = '.' 
out = 'build' 

def options(opt): 
    opt.load('compiler_cxx') 

def configure(conf): 
    conf.load('compiler_cxx') 
    # conf.env.append_value('LINKFLAGS', '-framework GLUT -framework OpenGL') 

def build(bld): 
    bld.program(
     source  = 'main.cpp', 
     target  = 'a', 
     linkflags = ["-framework GLUT", "-framework OpenGL"], 
) 

但是,當我建我得到它連接錯誤:

$ waf configure 
Setting top to       : /Users/tt/Documents/class/labs/Lab 3 fixed/src 
Setting out to       : /Users/tt/Documents/class/labs/Lab 3 fixed/src/build 
Checking for 'g++' (c++ compiler)  : /usr/bin/g++ 
'configure' finished successfully (0.040s) 
$ waf 
Waf: Entering directory `/Users/tt/Documents/class/labs/Lab 3 fixed/src/build' 
[2/2] cxxprogram: build/main.cpp.1.o -> build/a 
Undefined symbols for architecture x86_64: 
"_glViewport", referenced from: 
    resize(int, int)in main.cpp.1.o 
"_glMatrixMode", referenced from: 
    resize(int, int)in main.cpp.1.o 
    Camera::show()  in main.cpp.1.o 
"_glLoadIdentity", referenced from: 
    resize(int, int)in main.cpp.1.o 
    Camera::show()  in main.cpp.1.o 
"_gluPerspective", referenced from: 
    resize(int, int)in main.cpp.1.o 
"_glutPostRedisplay", referenced from: 
    resize(int, int)in main.cpp.1.o 
    idle() in main.cpp.1.o 
"_gluLookAt", referenced from: 
    Camera::show()  in main.cpp.1.o 
"_glRotatef", referenced from: 
    Camera::show()  in main.cpp.1.o 
"_glTranslatef", referenced from: 
    Camera::show()  in main.cpp.1.o 
"_glEnableClientState", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glUseProgram", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glGetAttribLocation", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glEnableVertexAttribArray", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glBindBuffer", referenced from: 
    Mesh::render()  in main.cpp.1.o 
    Mesh::Mesh(char*)in main.cpp.1.o 
"_glVertexPointer", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glVertexAttribPointer", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glNormalPointer", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glDrawElements", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glDisableClientState", referenced from: 
    Mesh::render()  in main.cpp.1.o 
"_glEnable", referenced from: 
    display() in main.cpp.1.o 
"_glClearColor", referenced from: 
    display() in main.cpp.1.o 
"_glClear", referenced from: 
    display() in main.cpp.1.o 
"_glutSwapBuffers", referenced from: 
    display() in main.cpp.1.o 
"_glCreateProgram", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glCreateShader", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glShaderSource", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glCompileShader", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glGetShaderiv", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glGetShaderInfoLog", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glAttachShader", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glLinkProgram", referenced from: 
    setupGLSL(char*)in main.cpp.1.o 
"_glGenBuffers", referenced from: 
    Mesh::Mesh(char*)in main.cpp.1.o 
"_glBufferData", referenced from: 
    Mesh::Mesh(char*)in main.cpp.1.o 
"_glutInit", referenced from: 
    _main in main.cpp.1.o 
"_glutInitDisplayMode", referenced from: 
    _main in main.cpp.1.o 
"_glutInitWindowSize", referenced from: 
    _main in main.cpp.1.o 
"_glutCreateWindow", referenced from: 
    _main in main.cpp.1.o 
"_glutDisplayFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutIdleFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutReshapeFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutKeyboardFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutKeyboardUpFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutSpecialFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutMouseFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutMotionFunc", referenced from: 
    _main in main.cpp.1.o 
"_glutMainLoop", referenced from: 
    _main in main.cpp.1.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
Waf: Leaving directory `/Users/n7down/Documents/class/spring 2013/5542 (Real Time Rendering)/labs/Lab 3 fixed/src/build' 
Build failed 
-> task in 'a' failed (exit status 1): 
{task 4537197904: cxxprogram main.cpp.1.o -> a} 
['/usr/bin/g++', '-framework GLUT', '-framework OpenGL', 'main.cpp.1.o', '-o', '/Users/tt/Documents/class/labs/Lab 3 fixed/src/build/a'] 

有沒有辦法可以修復/做到這一點?

+0

是否編譯? – drahnr 2013-03-11 19:50:31

+0

當我在終端中使用g ++ main.cpp -framework GLUT -framework OpenGL時,我沒有收到任何編譯或鏈接錯誤。 – user2154611 2013-03-11 21:08:16

+0

你使用的是什麼waf版本? – drahnr 2013-03-12 15:34:25

回答

2

那麼你的ploblem似乎是直接使用LINKFLAGS與'-framework X'的論點。它將被python錯誤地解釋。直接使用WAF提供的framework參數:手動做時,它

top = '.' 
out = 'build' 

def options(opt): 
    opt.load('compiler_cxx') 

def configure(conf): 
    conf.load('compiler_cxx') 

def build(bld): 
    bld.program(
     source  = 'main.cpp', 
     target  = 'a', 
     framework = ["GLUT", "OpenGL"], 
    )