【问题标题】:Linking GLEW with CMake将 GLEW 与 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.stackoverflow.com/rooms/34546/c房间,这样我们就不会在评论区泛滥了。

标签: cmake dynamic-linking glew


【解决方案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 for find_package 告诉 CMake 在找不到包时立即停止配置。因此,之后不需要检查 GLEW_FOUND 变量 - CMake 仅在找到包时才会处理 find_package() 之后的行。
  • 非常好的乔尼。这解决了我的问题。
【解决方案2】:

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

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

YourTarget 是您使用add_executableadd_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_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)
    

    参考:

    【讨论】:

      【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          • 1970-01-01
          • 2017-09-24
          • 2014-08-16
          • 2023-03-29
          相关资源
          最近更新 更多