将 GLEW 与 CMake 连接起来
Posted
技术标签:
【中文标题】将 GLEW 与 CMake 连接起来【英文标题】:Linking GLEW with CMake 【发布时间】:2014-12-14 18:52:29 【问题描述】:如何使用 CMake 将 GLEW 链接到项目?
我们已经尝试使用 CMake 将 GLEW 链接到我们的项目至少 3 个小时,但没有任何成功,因此我们接受了任何帮助。
我正在使用 CMake 3.1.0 附带的 FindGLEW.cmake
CMakeLists.txt
find_package(GLEW REQUIRED)
if (GLEW_FOUND)
include_directories($(GLEW_INCLUDE_DIRS))
endif()
环境变量
我正在使用 MinGW w64 编译源代码,我们只需将包含和库复制到各自的文件夹即可成功链接 GLFW 和 GLM,但在使用 GLEW 执行相同操作后,CMake 仍然无法没找到。
抱歉,如果我在提出问题时不够清楚。我将提供所需的任何其他信息。
编辑:我已经设法通过在 CMake 缓存文件中指定头文件的位置来链接头文件,尽管我得到了对像 glewInit()
这样的 glew 函数的未定义引用。
【问题讨论】:
是找不到 GLEW 还是没有链接? 它无法找到 GLEW,尽管我认为我们设法让它找到了一次头文件,但没有找到库。 那些是系统环境变量吗?我不知道 CMake 会检查它们。您可以在运行 cmake 或在 cmake-gui 中将它们指定为 CMake 变量。您还可以修改 CMake 缓存以指向正确的位置。 是的,它们是系统环境变量。我们通过在环境变量中设置 BOOST_ROOT 来链接 boost。我可以在 CMakeLists 文件中指定这些吗?如果有,怎么做? 加入chat.***.com/rooms/34546/c房间,这样我们就不会在评论区泛滥了。 【参考方案1】:像 FindGLEW 这样的典型 CMake 脚本将定义用于指定项目所需路径和文件的变量。如果脚本无法自动识别正确的路径(通常是因为安装位置不标准,这很好),那么它会将这些变量留给您填写。
使用命令行 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)
【讨论】:
选项 REQUIRED forfind_package
告诉 CMake 在找不到包时立即停止配置。因此,之后不需要检查 GLEW_FOUND
变量 - 只有在找到包时,CMake 才会处理 find_package()
之后的行。
非常好的乔尼。这解决了我的问题。【参考方案2】:
其他答案显然有效,但基于目标的 cmake 风格使其变得更加容易,因为 GLEW 查找模块定义了导入的目标 GLEW::GLEW
。您只需要:
find_package(GLEW REQUIRED)
target_link_libraries(YourTarget GLEW::GLEW)
YourTarget
是您使用add_executable
或add_library
创建的目标。不需要显式添加包含目录,它们是通过链接目标自动添加的。
【讨论】:
【参考方案3】:find_package(GLEW)
的秘密在 FindGLEW.cmake 文件和 cmake install 中。
find_path(GLEW_INCLUDE_DIR GL/glew.h)
find_library(GLEW_LIBRARY NAMES GLEW glew32 glew glew32s PATH_SUFFIXES lib64)
find_path
和 find_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)
参考:
http://www.cmake.org/cmake/help/v3.0/command/find_path.html http://www.cmake.org/cmake/help/v3.0/command/find_library.html【讨论】:
【参考方案4】:我正在努力通过 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。希望这可以帮助。
快乐编码:)
【讨论】:
【参考方案5】:最后我找到了一个简单而简短的 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)
【讨论】:
以上是关于将 GLEW 与 CMake 连接起来的主要内容,如果未能解决你的问题,请参考以下文章
GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”