在C语言中链接GLEW

5

我无法正确地链接到glew。

我已经做了以下几点:

#define GLEW_STATIC
#include "glew/glew.h"
#pragma comment(lib, "glew/glew32s.lib")

然而,我仍然遇到了错误:
LNK2019: 无法解析的外部符号__glewGenBuffersARB,它在函数initialize中被引用。

2
你正在构建一个32位或64位的程序,你是否使用了正确相应的glew32s.lib文件? - Mark
也许你应该在 #include 中使用 <> 括号? - Eitan T
似乎链接器找不到glew.lib文件。请检查它是否在库搜索路径中。 - Tal Darom
@EitanT 如果那是问题,它会在编译时失败。但在这种情况下,故障出现在链接时间。 - Tal Darom
@Mark 我正在一台64位机器上运行。我不确定如何重新构建glew以在64位上运行。 - LunchMarble
显示剩余4条评论
2个回答

13

省下很多麻烦,只需将glew.c文件放入您的项目中即可。我从不费心外部链接到glew库。一旦您将其放在那里,GLEW_STATIC宏就会起作用。这仅是一个文件,而且(如果这对您很重要)它可以在各个平台之间顺畅地运行(而不必重新构建几个特定于操作系统的库)。


1
不,你永远不应该直接将外部库源文件添加到自己的项目构建中。大多数软件包(包括GLEW在内)都需要在其构建系统中进行构建配置步骤,以检查构建系统的属性和所需依赖项的存在。如果您希望您的可执行二进制文件易于重新分发,则应构建所需库的特殊目的构建,然后将其静态链接或动态链接到相对于二进制文件的特定路径。这两个选项都可以通过链接器选项轻松控制。 - datenwolf
2
但是你永远不要在自己的项目中裸露地包含外部源文件!!!这是灾难的配方。 - datenwolf
2
有人会认为,如果有人用全部大写的方式对某人大喊大叫,那么他们应该拼写正确。 - nwalke
1
@datenwolf,你所说的可能适用于更复杂的库,但GLEW不是其中之一。你可能喜欢携带GLEW的32位构建、64位构建、ARM构建等,但我宁愿直接构建它。你提出的解决方案浪费了时间,只是为了在某些无关紧要的事情上过于追求严谨。 - TheBuzzSaw
1
@datenwolf,你玩得开心。我仍然不知道你为什么要在3个月前解决了这个人的问题的答案上投反对票。你正在进行一场十分激烈的斗争。 - TheBuzzSaw
显示剩余3条评论

1

我希望通过提供更详细的答案来扩展@TheBuzzSaw的出色想法,针对一个cmake项目。

  1. 这里下载GLEW源码。
  2. 解压缩存档并将两个文件(src/glew.cinclude/GL/glew.h)复制到您的项目目录中。
  3. 编辑glew.c文件,使其开头看起来像这样:
#ifndef GLEW_INCLUDE
#include "glew.h"  /* Point to local glew.h file. */
#else
#include GLEW_INCLUDE
#endif
  1. 在您的main.cpp文件中使用以下内容以正确包含静态GLEW:
#define GLEW_STATIC
#include "glew.h"

要构建该项目,您必须编译和链接静态的GLEW库。以下是使用复制文件的示例CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.17)
project(your-project-name)

add_library(STATIC_GLEW glew.c)
add_executable(your-project-name main.cpp)


target_link_libraries(your-project-name STATIC_GLEW)

现在,您应该能够在没有任何链接错误的情况下构建您的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接