使用CMake链接GLEW

31

如何在CMake中将GLEW链接到项目中?

我们已经尝试了至少3个小时使用CMake将GLEW链接到我们的项目中,但没有成功。欢迎任何帮助。

我正在使用随CMake 3.1.0提供的FindGLEW.cmake文件。

CMakeLists.txt

find_package(GLEW REQUIRED)
if (GLEW_FOUND)
    include_directories($(GLEW_INCLUDE_DIRS))
endif()

环境变量

enter image description here enter image description here

我正在使用MinGW w64编译源代码,将包含文件和库文件复制到它们各自的文件夹中后,我们成功地链接了GLFW和GLM,但在完成相同操作后,CMake仍然找不到GLEW。

如果我表达问题不够清楚,请您谅解。我可以提供任何额外所需信息。


编辑:通过在CMake Cache文件中指定它们的位置,我设法链接头文件,但是我正在收到关于glew函数的未定义引用,例如glewInit()


它是无法定位GLEW还是只是没有链接? - Jonny D
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lord Zsolt
这些是系统环境变量吗?我不知道CMake是否会检查它们。您可以在运行cmake时或在cmake-gui中指定这些变量作为CMake变量。您还可以修改CMake缓存以指向正确的位置。 - Jonny D
是的,它们是系统环境变量。我们通过在环境变量中设置BOOST_ROOT来链接boost。我能在CMakeLists文件中指定它们吗?如果可以,怎么做? - Lord Zsolt
加入 http://chat.stackoverflow.com/rooms/34546/c 聊天室,这样我们就不会在评论区刷屏了。 - Lord Zsolt
6个回答

32

典型的CMake脚本(如FindGLEW)会定义变量,指定项目所需的路径和文件。如果脚本无法自动识别正确的路径(通常是因为非标准安装位置,这没关系),则它会留给您填写这些变量。

使用命令行CMake,您可以使用-D标志来定义和设置特定变量的值。其他CMake界面(如CMake-gui或IDE集成)以其他方式提供此功能。

不管你怎么做,你也可以直接修改缓存(CMakeCache.txt)并查看CMake正在使用的内容,或者完全清除缓存。您需要重新运行CMake才能获取您的更改。

当涉及链接时,您需要告诉CMake要链接哪些库。使用link_libraries命令与自动化脚本提供的内容。

find_package(GLEW REQUIRED)
include_directories(${GLEW_INCLUDE_DIRS})
link_libraries(${GLEW_LIBRARIES})

非常好,Jonny。这解决了我的问题。 - rsonx

30

其他答案显然有效,但基于目标的CMake风格使其变得更容易,因为GLEW查找模块定义了导入目标GLEW::GLEW。你所需要做的就是:

target_link_libraries(your_target GLEW::GLEW)

find_package(GLEW REQUIRED)
target_link_libraries(YourTarget GLEW::GLEW)

YourTarget是您使用add_executableadd_library创建的目标。不需要显式添加包含目录,因为它们会通过链接目标自动添加。


13

find_package(GLEW)的秘密在于使用CMake安装时的FindGLEW.cmake文件。

find_path(GLEW_INCLUDE_DIR GL/glew.h)
find_library(GLEW_LIBRARY NAMES GLEW glew32 glew glew32s PATH_SUFFIXES lib64)

find_pathfind_library 命令可以在标准系统路径中查找路径。如果你想让它们在用户自定义的目录中查找路径,你需要告诉它们。

例如:
set(CMAKE_PREFIX_PATH "d:/libs/glew-1.10.0")
set(CMAKE_LIBRARY_PATH "d:/libs/glew-1.10.0/lib/Release/Win32/")
find_package(GLEW REQUIRED)

参考资料:


1

我努力地尝试在Mac上通过命令行将glew链接到cmake。这可能有帮助,但我不确定 :) 我将一步一步地向您展示我所做的事情。

我从web安装了Cmake源码。

然后我在终端中进入了cmake文件夹并输入了以下内容:

./bootstrap && make && make install 

(这将在我们的操作系统平台上安装CMake命令行工具)

我有一些练习文件。我希望CMake为我生成所有这些练习文件(例如triangles.cpp,shader.cpp等)的Xcode文件,因此我在练习文件夹内创建了一个目录。

$ mkdir xcode 
$ cd xcode
$ cmake -G "Xcode" ..

此时,Cmake应该安装所有包含正确库的Xcode文件。但是出现了错误:

$ cmake -G "Xcode" ..
CMake Warning (dev) at CMakeLists.txt:3 (cmake_minimum_required):
Compatibility with CMake < 2.4 is not supported by CMake >= 3.0.
This warning is for project developers.  Use -Wno-dev to suppress it.

system name is: Darwin-14.1.0
system processor is: x86_64
-- Could NOT find GLEW (missing:  GLEW_INCLUDE_DIR GLEW_LIBRARY) 
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE) 
-- Using Cocoa for window creation
-- Using NSGL for context creation
-- Building GLFW only for the native architecture

CMake Error: The following variables are used in this project, but they are  set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
GLEW_LIBRARY
linked by target "TextureLoader" in directory /Users/Mydir/Desktop/Exercise/Exercise Files

-- Configuring incomplete, errors occurred!

为了确保我已经正确安装了GLEW及其所有库,我运行了以下命令:

$brew install glew 

是的,我已经安装了glew,但它还没有被链接。请看下面的警告:

Warning: glew-1.12.0 already installed, it's just not linked

然后我运行了以下命令:

$ brew unlink glew 
$ brew link glew

我已经解决了错误。所以请确保你已经链接了glew。希望这能有所帮助。

编程愉快 :)


0

最后我找到了一个简单而短小的CMakeLists,如果你已经在默认路径下安装了所有东西(openGL、glfw和glew),它就能正常工作。

cmake_minimum_required(VERSION 3.3)
project(openGL_tutorial)
find_package(OpenGL REQUIRED)
if(NOT OPENGL_FOUND)
     message("ERROR: OpenGL not found")
endif(NOT OPENGL_FOUND)
set(GL_LIBRARY GL GLU X11)

add_executable(openGL_tutorial main.cpp)
target_link_libraries(openGL_tutorial glfw GLEW libGLEW.so libGLU.so libGL.so)

0

值得一提的是,在2023年,我在macOS上使用Homebrew安装了GLEW、GLFW和CMake,这对我很有效:

cmake_minimum_required(VERSION 3.10)
project(Project)
add_executable(Project main.cpp)
find_package(glfw3 REQUIRED)
find_package(GLEW REQUIRED)
target_link_libraries(Project glfw GLEW::glew)

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