2017-11-16 9 views
0

나는 스택 오버 플로우와 구글을 알아 내려고 노력했지만, 동적 링크에 관해서 본 모든 것이 작동하지 않거나 정적 링크를 끝내게된다.Gake와 CMake를 동적으로 연결하기

E:/CLion/GLEW-Test/main.cpp:8: undefined reference to `[email protected]' 
E:/CLion/GLEW-Test/main.cpp:12: undefined reference to `[email protected]' 
E:/CLion/GLEW-Test/main.cpp:14: undefined reference to `[email protected]' 

저는 CLION을 사용하여 GLEW를 동적으로 연결하려고합니다. 문제는 Visual Studio로 자랐습니다. 그래서 그것에 대해 많이 생각할 필요가 없었습니다. 나는 CMake와 OpenGL을 가르치려고 노력하고있어, 이것이 완벽한 운동이었을 것이다.

GLEW 용 소스를 다운로드하고 CMake 및 MinGW로 빌드했습니다. 나는 을 C:/Windows/System32/에 넣었고 libglew32.aC:/MinGW/lib에 넣었고 , glxew.hwglew.hC:/MinGW/include/GL에 넣었습니다.

현재 빌드 디렉토리에 glew32.dll, libglu32.alibopengl32.a 라이브러리가 있습니다. 여기

내 CMakeLists.txt입니다 :

cmake_minimum_required(VERSION 3.8) 
project(GLEW_Test) 

set(CMAKE_CXX_STANDARD 11) 
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") 
set(CMAKE_VERBOSE_MAKEFILE on) 

set(SOURCE_FILES main.cpp) 
add_executable(GLEW_Test ${SOURCE_FILES}) 
target_link_libraries(GLEW_Test glew32 glu32 opengl32) 

이 내 MAIN.CPP입니다 : 내가 #include <GL/glew.h> 전에 프로그램을 컴파일하고 예상 출력을 출력 #define GLEW_STATIC 경우, 지금

#include <iostream> 
#include <GL/glew.h> 

int main() 
{ 
    std::cout << "Hello, World!" << std::endl; 

    GLenum err = glewInit(); 
    if (GLEW_OK != err) 
    { 
     /* Problem: glewInit failed, something is seriously wrong. */ 
     fprintf(stderr, "Error: %s\n", glewGetErrorString(err)); 
    } 
    fprintf(stdout, "Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); 

    return 0; 
} 

(GLContext가없는 것에 대한 오류). 그러나, 내 지식에, 그것은 정적 링크이며 동적으로 GLEW를 연결하고 싶습니다. 내가 잘못 뭐하는 거지

"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" --build E:\CLion\GLEW-Test\cmake-build-debug --target GLEW_Test -- -j 2 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -HE:\CLion\GLEW-Test -BE:\CLion\GLEW-Test\cmake-build-debug --check-build-system CMakeFiles\Makefile.cmake 0 
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 GLEW_Test 
mingw32-make.exe[1]: Entering directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -HE:\CLion\GLEW-Test -BE:\CLion\GLEW-Test\cmake-build-debug --check-build-system CMakeFiles\Makefile.cmake 0 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -E cmake_progress_start E:\CLion\GLEW-Test\cmake-build-debug\CMakeFiles 2 
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\Makefile2 CMakeFiles/GLEW_Test.dir/all 
mingw32-make.exe[2]: Entering directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\GLEW_Test.dir\build.make CMakeFiles/GLEW_Test.dir/depend 
mingw32-make.exe[3]: Entering directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" E:\CLion\GLEW-Test E:\CLion\GLEW-Test E:\CLion\GLEW-Test\cmake-build-debug E:\CLion\GLEW-Test\cmake-build-debug E:\CLion\GLEW-Test\cmake-build-debug\CMakeFiles\GLEW_Test.dir\DependInfo.cmake --color= 
mingw32-make.exe[3]: Leaving directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
C:/MinGW/bin/mingw32-make.exe -f CMakeFiles\GLEW_Test.dir\build.make CMakeFiles/GLEW_Test.dir/build 
mingw32-make.exe[3]: Entering directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
[ 50%] Linking CXX executable GLEW_Test.exe 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -E cmake_link_script CMakeFiles\GLEW_Test.dir\link.txt --verbose=1 
"C:\Program Files\JetBrains\CLion 2017.2.2\bin\cmake\bin\cmake.exe" -E remove -f CMakeFiles\GLEW_Test.dir/objects.a 
C:\MinGW\bin\ar.exe cr CMakeFiles\GLEW_Test.dir/objects.a @CMakeFiles\GLEW_Test.dir\objects1.rsp 
C:\MinGW\bin\g++.exe -Wall -Wextra -g -Wl,--whole-archive CMakeFiles\GLEW_Test.dir/objects.a -Wl,--no-whole-archive -o GLEW_Test.exe -Wl,--out-implib,libGLEW_Test.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\GLEW_Test.dir\linklibs.rsp 
CMakeFiles\GLEW_Test.dir/objects.a(main.cpp.obj): In function `main': 
E:/CLion/GLEW-Test/main.cpp:8: undefined reference to `[email protected]' 
E:/CLion/GLEW-Test/main.cpp:12: undefined reference to `[email protected]' 
E:/CLion/GLEW-Test/main.cpp:14: undefined reference to `[email protected]' 
collect2.exe: error: ld returned 1 exit status 
mingw32-make.exe[3]: *** [GLEW_Test.exe] Error 1 
CMakeFiles\GLEW_Test.dir\build.make:98: recipe for target 'GLEW_Test.exe' failed 
mingw32-make.exe[2]: *** [CMakeFiles/GLEW_Test.dir/all] Error 2 
mingw32-make.exe[3]: Leaving directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
mingw32-make.exe[1]: *** [CMakeFiles/GLEW_Test.dir/rule] Error 2 
CMakeFiles\Makefile2:69: recipe for target 'CMakeFiles/GLEW_Test.dir/all' failed 
mingw32-make.exe[2]: Leaving directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
CMakeFiles\Makefile2:81: recipe for target 'CMakeFiles/GLEW_Test.dir/rule' failed 
mingw32-make.exe[1]: Leaving directory 'E:/CLion/GLEW-Test/cmake-build-debug' 
Makefile:120: recipe for target 'GLEW_Test' failed 
mingw32-make.exe: *** [GLEW_Test] Error 2 

: 이것은 내가 #define GLEW_STATIC없이 컴파일 할 때 내가 볼 무엇인가? 나는 glew's sourceforge에서 가이드를 따르고 .dll을 내 System32 폴더에 두었습니다. CMake와 MinGW로 만들었으므로 .lib 파일 대신 .a 파일을 가지고 있으며, MinGW/lib 디렉토리에 그것들을 찔러 넣었습니다. 내가 모르는 유일한 이유는 내 libglew32.dll.a와 아무런 관련이 없다. 이것이 범인인가? 나는 그것으로 무엇을 해야할지 모르겠다. 그리고 .dll.a 파일에 대한 정보를 인터넷 검색은 아무것도 나타나지 않았다.

+1

일반적으로 실제 컴파일러 호출을보고 올바른 옵션을 찾기 위해 수동으로 실행하려면'make '의 자세한 정보를 늘리십시오. 'make VERBOSE = 1'이 그것에 사용됩니다. 'cmake.exe -build E : \ CLion \ GLEW-Test \ cmake-build-debug --target GLEW_Test - -j 2 VERBOSE = 1 이렇게하면 'mingw32-make.exe'로 같은 것을 시도 할 수 있습니다. 왜냐하면'cmake.exe --build'는 기본적으로'make' 호출이기 때문입니다. 라이브러리에 관해서 : 저는 어떤 구성이라도'target_link_libraries (GLEW_Test libglew32 libglu32 libopengl32)'이어야한다고 생각합니다 (정적 또는 동적 링크는 다른 곳에서 결정됩니다). – Velkan

+0

자세한 출력을 업데이트했습니다. 나는 다른 것을 보지 못한다. 그것은 링크 후 일부 glew 기능을 해결할 수없는 것 같습니다. – Acorn

답변

0

좋아, 그래서 조금 주위를 검색하고 .dll.a 파일이 무엇인지 이해하려고 시도한 후에 알아 냈어!

  1. 내가 내 C:\MinGW\lib 디렉토리에서 glew32.a을 삭제하고, 내 빌드 폴더에 glew32.dll를 배치 glew32.dll.a
  2. 로 대체 : 이것은 동적으로 CMake 사용 glew 링크 한 것입니다

    . 그러나 SysWOW64 폴더에 저장할 수도 있습니다.

그게 전부입니다! 내 CMakeLists.txt는 여전히 동일합니다.

2
target_link_libraries(GLEW_Test libglew32.a libglu32.a libopengl32.a) 

당신은 "LIB"접두어와 target_link_libraries에서 라이브러리의 파일 확장자를 포함해서는 안됩니다. 대신이 작업을 수행해야합니다.

target_link_libraries(GLEW_Test glew32 glu32 opengl32) 

cmake는 이미 예를 들어. glew32.dll, libglew32.a 그 자체. 이렇게하면 플랫폼/컴파일러와 독립적으로 유지됩니다.

테스트 용/불확실한 목적을 위해 라이브러리에 windows 링커 searches the executable's directory first이 있기 때문에 실행 파일의 디렉토리에 필요한 라이브러리를 먼저두고 오류가 계속 발생하는지 확인하는 것이 좋습니다.

라이브러리가 다른 위치에있을 때 더 이상 발생하지 않지만 해당 위치가 PATH 환경 변수의 일부인지 확인하십시오.

+0

그건 의미가 있습니다. 나는 그들에 "lib"접두사를 두는 것에 관한 담장 위에 있었다. 그래서, 빌드 빌드 디렉토리에'glew32.dll','libglu32.a','libopengl32.a'을 넣었습니다. 그러나 여전히 전체적인 오류가 발생합니다 : glew 함수에 대한 정의되지 않은 참조 ('_imp__glewInit @ 0 '에 대한 정의되지 않은 참조). 어떤 이유로 든 프로그램을 올바르게 찾고 연결하지만 이러한 기능을 해결할 수 없습니까? – Acorn

+0

내 glew 빌드 디렉토리에 libglew32.dll.a가 있었는데, 그게 무슨 뜻인지 아시겠습니까? glew 사이트에 기록이 없습니다. – Acorn

+0

링크 된 라이브러리의 순서를 변경해 보셨습니까? 특히 정적 라이브러리에서는 순서가 중요하다고 생각합니다. –