2016-09-15 49 views
5

Tak, używam freeglut spróbować zrobić kilka openGL rzeczy, ale wciąż otrzymuję błędy mówiące, że odwołania są niezdefiniowane:Łączenie błąd w OpenGL używając freeglut w Clion

CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper4initEv': 
.../TextureMapper.cpp:20: undefined reference to `[email protected]' 
.../TextureMapper.cpp:23: undefined reference to `[email protected]' 
.../TextureMapper.cpp:24: undefined reference to `[email protected]' 
.../TextureMapper.cpp:25: undefined reference to `[email protected]' 
CMakeFiles\texture_mapping.dir/objects.a(TextureMapper.cpp.obj): In function `ZN13TextureMapper7displayEv': 
.../TextureMapper.cpp:45: undefined reference to `[email protected]' 
...TextureMapper.cpp:48: undefined reference to `[email protected]' 
...TextureMapper.cpp:49: undefined reference to `[email protected]' 
...TextureMapper.cpp:52: undefined reference to `[email protected]' 
...TextureMapper.cpp:53: undefined reference to `[email protected]' 
...TextureMapper.cpp:54: undefined reference to `[email protected]' 
...TextureMapper.cpp:55: undefined reference to `[email protected]' 
...TextureMapper.cpp:58: undefined reference to `[email protected]' 
...TextureMapper.cpp:61: undefined reference to `[email protected]' 

Używam MinGW z Clion do zrób ten projekt. Myślałem, że wszystko dostałem poprawnie. Przeniosłem odpowiednie pliki do folderu include w aplikacji MinGW, a także do folderu bin, a także do folderu lib. Wtedy, mam to w moim CMakeLists.txt:

cmake_minimum_required(VERSION 3.3) 
project(texture_mapping) 
find_package(OpenGL REQUIRED) 
find_package(GLUT REQUIRED) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

set(SOURCE_FILES main.cpp TextureMapper.cpp TextureMapper.h Vertex.h ObjParser.cpp ObjParser.h) 

add_executable(texture_mapping ${SOURCE_FILES}) 
target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a) 

Biblioteki I związane były tylko pliki bibliotek, które weszły z freeglut.

Więc, czego mi brakuje? CLion nie pokazuje żadnych błędów, zanim zostanie skompilowany. Mogę nawet wejść do funkcji w plikach nagłówkowych dostarczanych przez freeglut. Dlaczego więc te funkcje nie są zdefiniowane w moim programie?

+0

Twój problem ma nic wspólnego z CLion. Chodzi tylko o CMake i twoje środowisko. – Sergey

Odpowiedz

1

W rzeczywistości nie połączyłeś OpenGL z projektem, więc otrzymasz niezdefiniowane odwołania do funkcji OpenGL. Spróbuj zamienić

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a) 

z

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a GL) 

I zamieszczonym problem z CMakeLists.txt i następujący program:

#include <GL/gl.h> 

int main() { 
     glClear(GL_COLOR_BUFFER_BIT); 
     return 0; 
} 

i rozwiązać go z powyższej wymiany. Rozwiązanie automatycznie łączy biblioteki GL z mojej biblioteki ścieżce:

$ ls -1 /usr/lib64/libGL.* 
/usr/lib64/libGL.la 
/usr/lib64/libGL.so 
/usr/lib64/libGL.so.1 
/usr/lib64/libGL.so.1.0.0 

UPDATE

Według this, masz kilka zmiennych aby uzyskać dostęp do aktualnych bibliotek OpenGL. Na przykład, można wskazać na OpenGL plik biblioteki (s) bezpośrednio tak:

target_link_libraries(texture_mapping libfreeglut.a libfreeglut_static.a ${OPENGL_gl_LIBRARY}) 

Również można dodać OpenGL katalog biblioteki do library search path (zrób to przed target_link_libraries):

link_directories(${OPENGL_gl_LIBRARY}) 
+0

Otrzymuję 'c:/mingw/bin /../ lib/gcc/mingw32/4.8.1 /../../../../ mingw32/bin/ld.exe: nie można znaleźć -lGL' jako w wyniku tego. –

+0

@CacheStaheli Zaktualizowałem swoją odpowiedź. To powinno działać, ponieważ uwzględnia rzeczywiste środowisko. – Sergey

+0

Gdy tylko dodałem wywołanie 'link_directories', wraz z dodatkową biblioteką (' $ {OPENGL_gl_LIBRARY} ') w' target_link_libraries', zadziałało to znakomicie. Dzięki! –