首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态链接GLEW和CMake

动态链接GLEW和CMake
EN

Stack Overflow用户
提问于 2017-11-16 03:41:12
回答 2查看 2.9K关注 0票数 0

我已经查看过Stack溢出和Google试图找出这一点,但是我所看到的关于动态链接的所有东西要么不起作用,要么以静态链接告终。

代码语言:javascript
复制
E:/CLion/GLEW-Test/main.cpp:8: undefined reference to `_imp__glewInit@0'
E:/CLion/GLEW-Test/main.cpp:12: undefined reference to `_imp__glewGetErrorString@4'
E:/CLion/GLEW-Test/main.cpp:14: undefined reference to `_imp__glewGetString@4'

我正在尝试使用CLion动态链接GLEW。问题是,我是在Visual中长大的,所以我从来没有考虑过这个问题。我试着教自己CMake和OpenGL,所以这将是一个完美的练习。

我下载了GLEW的源代码,并使用CMake和MinGW构建了它。我将结果glew32.dll放在C:/Windows/System32/中,将libglew32.a放在C:/MinGW/lib中,并将glew.hglxew.hwglew.h放入C:/MinGW/include/GL中。

目前,我的构建目录中还有库glew32.dlllibglu32.alibopengl32.a

这是我的CMakeLists.txt:

代码语言:javascript
复制
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:

代码语言:javascript
复制
#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;
}

现在,如果我在我的#define GLEW_STATIC之前#include <GL/glew.h>,程序编译并输出预期的输出(一个没有GLContext的错误)。然而,据我所知,这是静态链接,我想动态链接GLEW。这就是我在没有#define GLEW_STATIC的情况下编译时所看到的

代码语言:javascript
复制
"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 `_imp__glewInit@0'
E:/CLion/GLEW-Test/main.cpp:12: undefined reference to `_imp__glewGetErrorString@4'
E:/CLion/GLEW-Test/main.cpp:14: undefined reference to `_imp__glewGetString@4'
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

我做错了什么?我遵循glew's sourceforge的指南,将.dll放在我的System32文件夹中。由于我是用CMake和MinGW构建的,所以我使用的是.a文件而不是.lib文件,所以我将这些文件放在MinGW/lib目录中。我唯一没有做的事情(因为我不确定),就是我的libglw32.dll什么也不做。是罪魁祸首吗?我不知道该如何处理它,谷歌搜索.dll.a文件上的信息什么也找不到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-17 02:19:45

好的,在googling搜索了一下并试图了解.dll.a文件是什么之后,我已经弄明白了!

这就是我使用CMake动态链接glew时所做的事情:

  1. 我从我的glew32.a目录中删除了C:\MinGW\lib,并将其替换为glew32.dll.a
  2. 我将glew32.dll放在构建文件夹中。但是,您也可以将它放在您的SysWOW64文件夹中,并且应该可以工作。

仅此而已!我的CMakeLists.txt还是一样的。

票数 0
EN

Stack Overflow用户

发布于 2017-11-16 10:38:46

代码语言:javascript
复制
target_link_libraries(GLEW_Test libglew32.a libglu32.a libopengl32.a)

您不应该在target_link_libraries中包括"lib“前缀和库的文件扩展名。相反,你应该这样做

代码语言:javascript
复制
target_link_libraries(GLEW_Test glew32 glu32 opengl32)

因为cmake已经在搜索例如lew32.dll,libgliw32.a本身。这样,您还可以保持平台/编译器的独立性。

为了进行测试/调试,我建议您首先将所需的库放在可执行文件的目录中,并检查错误是否仍然发生,因为用于库的windows链接器先搜索可执行文件的目录

如果不再发生这种情况,但是当库位于其他位置时,请确保这些位置是PATH环境变量的一部分。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47321186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档