动态链接GLEW和CMake

时间:2017-11-16 03:41:13

标签: c++ windows opengl cmake clion

我已经查看了Stack Overflow和谷歌试图解决这个问题,但我所看到的关于动态链接的一切都不起作用,或者他们最终导致静态链接。

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 Studio中长大,所以我从来没有真正考虑过它。我试图自学CMake和OpenGL,所以这将是一个完美的练习。

我下载了GLEW的源代码并使用CMake和MinGW构建了它。我将生成的glew32.dll放在C:/Windows/System32/中,然后将libglew32.a放入C:/MinGW/lib,我放置glew.hglxew.h和{{ 1}}进入wglew.h

目前,我的构建目录中还有库C:/MinGW/include/GLglew32.dlllibglu32.a

这是我的CMakeLists.txt:

libopengl32.a

这是我的main.cpp:

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)

现在,如果在#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,程序将编译并输出预期的输出(没有GLContext的错误)。但是,据我所知,这是静态链接,我想动态链接GLEW。这是我在没有#include <GL/glew.h>编译时看到的内容:

#define GLEW_STATIC

我做错了什么?我按照glew's sourceforge处的指南进行操作,并将.dll放在我的System32文件夹中。由于我使用CMake和MinGW构建,我有.a文件而不是.lib文件,我把它们放在我的MinGW / lib目录中。 我唯一没做的事(因为我不确定),对我的libglew32.dll.a 无效 这是罪魁祸首吗?我不知道该怎么做,谷歌上搜索.dll.a文件的信息一事无成。

2 个答案:

答案 0 :(得分:2)

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

你永远不应该包括&#34; lib&#34;前缀和target_link_libraries中库的文件扩展名。相反,你应该这样做

target_link_libraries(GLEW_Test glew32 glu32 opengl32)

因为cmake已经搜索了例如然后glew32.dll,libglew32.a。这样,您也可以保持平台/编译器独立。

为了测试/ bughunt目的,我建议您先将所需的库放在可执行文件的目录中,然后检查错误是否仍然存在,因为windows链接器searches the executable's directory first已经存在。

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

答案 1 :(得分:0)

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

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

  1. 我从#include <stdio.h> #include <string> *#include <iostream>* int main(){ //correct creds std::string uname ("admin"); std::string pass ("password"); //input creds std::string r_uname; std::string r_pass; //ui printf("%s \n", "Please enter username"); //scanf("%s", r_uname); *std::cin >> r_uname;* printf("%s \n", "Please enter password"); //scanf("%s", r_pass); *std::cin >> r_pass;* //cred check if((r_uname == uname) && (r_pass == pass)){ printf("%s", "You are in"); } else{ printf("%s", "Wrong username/password"); } } 目录中删除了glew32.a,并将其替换为C:\MinGW\lib
  2. 我将glew32.dll.a放入我的构建文件夹中。但是,您也可以将它放在glew32.dll文件夹中,它应该可以使用。
  3. 这就是全部!我的CMakeLists.txt仍然是一样的。