我已经查看了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.h
,glxew.h
和{{ 1}}进入wglew.h
。
目前,我的构建目录中还有库C:/MinGW/include/GL
,glew32.dll
和libglu32.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文件的信息一事无成。
答案 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所做的:
#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
glew32.dll.a
放入我的构建文件夹中。但是,您也可以将它放在glew32.dll
文件夹中,它应该可以使用。这就是全部!我的CMakeLists.txt仍然是一样的。