我如何在 CMAKE 中链接 GLFW 和 Dear ImGUI

Posted

技术标签:

【中文标题】我如何在 CMAKE 中链接 GLFW 和 Dear ImGUI【英文标题】:How can i link GLFW and Dear ImGUI in CMAKE 【发布时间】:2021-06-17 06:56:15 【问题描述】:

最近几天我在搞乱 CMake,一切正常,除了我找不到将 ImGUI 与 GLFW 链接的方法

一切都是从源头构建的

这是错误:

Consolidate compiler generated dependencies of target glad
[  2%] Built target glad
Consolidate compiler generated dependencies of target stb
[  5%] Built target stb
Consolidate compiler generated dependencies of target glfw
[ 29%] Built target glfw
Consolidate compiler generated dependencies of target imgui
[ 30%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui.cpp.o
[ 31%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui_demo.cpp.o
[ 33%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui_draw.cpp.o
[ 34%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui_tables.cpp.o
[ 36%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui_widgets.cpp.o
[ 37%] Building CXX object CMakeFiles/imgui.dir/lib/imgui/imgui_impl_glfw.cpp.o
/home/erik/Workspace/LearnOpenGL/lib/imgui/imgui_impl_glfw.cpp:45:10: fatal error: GLFW/glfw3.h: No such file or directory
   45 | #include <GLFW/glfw3.h>
      |          ^~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/imgui.dir/build.make:146: CMakeFiles/imgui.dir/lib/imgui/imgui_impl_glfw.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:228: CMakeFiles/imgui.dir/all] Error 2
make: *** [Makefile:156: all] Error 2

这是我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.1)

project(LearnOpenGL)


set(SRC_DIR "$CMAKE_CURRENT_SOURCE_DIR/source")
set(LIB_DIR "$CMAKE_CURRENT_SOURCE_DIR/lib")

set(SOURCES "$SRC_DIR/Main.cpp"
    )


add_executable($PROJECT_NAME $SOURCES)

target_include_directories($PROJECT_NAME PRIVATE "$SRC_DIR")

set_property(TARGET $PROJECT_NAME PROPERTY CXX_STANDARD 11)


# GLFW

set(GLFW_DIR "$LIB_DIR/glfw")

set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "Build the GLFW example programs")
set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "Build the GLFW test programs")
set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "Build the GLFW documentation")
set(GLFW_INSTALL OFF CACHE INTERNAL "Generate installation target")

add_subdirectory("$GLFW_DIR")

target_link_libraries($PROJECT_NAME "glfw" "$GLFW_LIBRARIES")
target_include_directories($PROJECT_NAME PRIVATE "$GLFW_DIR/include")
target_compile_definitions($PROJECT_NAME PRIVATE "GLFW_INCLUDE_NONE")


# Glad

set(GLAD_DIR "$LIB_DIR/glad")

add_library("glad" "$GLAD_DIR/src/glad.c")

target_include_directories("glad" PRIVATE "$GLAD_DIR/include")
target_include_directories($PROJECT_NAME PRIVATE "$GLAD_DIR/include")
target_link_libraries($PROJECT_NAME "glad" "$CMAKE_DL_LIBS")


# GLM 

set(GLM_DIR "$LIB_DIR/glm")

add_subdirectory($GLM_DIR)

target_link_libraries($PROJECT_NAME "glm")


# STB

set(STB_DIR "$LIB_DIR/stb")

add_library("stb" "$STB_DIR/src/stb_image.cpp")

target_include_directories("stb" PRIVATE "$STB_DIR/include")
target_include_directories($PROJECT_NAME PRIVATE "$STB_DIR/include")
target_link_libraries($PROJECT_NAME "stb" "$CMAKE_DL_LIBS")


# Freetype

set(FREETYPE_DIR "$LIB_DIR/freetype")

add_subdirectory("$FREETYPE_DIR")

target_link_libraries($PROJECT_NAME "$FREETYPE_LIBRARIES")
target_include_directories($PROJECT_NAME PRIVATE "$FREETYPE_DIR/include")


# ImGUI

set(IMGUI_DIR "$LIB_DIR/imgui")

add_library("imgui" "$IMGUI_DIR/imgui.cpp"
                  "$IMGUI_DIR/imgui_demo.cpp"
                  "$IMGUI_DIR/imgui_draw.cpp"
                  "$IMGUI_DIR/imgui_tables.cpp"
                  "$IMGUI_DIR/imgui_widgets.cpp"
                  
                  "$IMGUI_DIR/imgui_impl_glfw.cpp"
                  "$IMGUI_DIR/imgui_impl_opengl3.cpp")

target_include_directories("imgui" PRIVATE "$IMGUI_DIR")
target_include_directories($PROJECT_NAME PRIVATE "$IMGUI_DIR")
target_link_libraries($PROJECT_NAME "imgui" "$CMAKE_DL_LIBS")

这是我的文件夹结构

 1. build
 2. lib
    -  freetype
    -  glad
    -  glfw
    -  glm
    -  imgui
    -  stb
 3. source
    -  Main.cpp
 4. CMakeLists.txt

这是我的问题:我如何告诉 imgui glfw 已经在这里并且他可以使用它?

提前致谢

【问题讨论】:

是否有包含您的代码的 GitHub 存储库?这个构建与你应该在 CMake 中合理地做的任何事情相去甚远,我很想帮助你重新编写它,但如果不能玩它,我就无法做到这一点我。如果您不想与我分享您的代码,我敦促您使用 vcpkg 和 find_package 来管理 CMake 中的依赖项。 例如调用add_subdirectory不会设置FREETYPE_LIBRARIES。我认为您已将此与find_package 混淆了。看起来您正在为 STB、Glad 和 ImGUI 编写自己的迷你构建系统。也许不这样做? 我会创建一个 github 供你查看 github.com/real2k/LearnOpenGL 在这里 【参考方案1】:

您的构建应该只包含以下内容:

cmake_minimum_required(VERSION 3.20)
project(LearnOpenGL)

## Find dependencies
find_package(glfw3 REQUIRED)
find_package(glad REQUIRED)
find_package(glm REQUIRED)
find_package(freetype REQUIRED)
find_package(imgui REQUIRED)

# stb does not have a CMake build, but is header-only
find_path(STB_INCLUDE_DIRS "stb.h") 

## Create main executable
add_executable(main source/Main.cpp)
target_include_directories(main 
  PRIVATE 
    $STB_INCLUDE_DIRS
    "$CMAKE_CURRENT_LIST_DIR/source"
)
target_link_libraries(
  main
  PRIVATE
    freetype
    glfw
    glad::glad
    glm::glm
    imgui::imgui
)

如果您不使用 CMake 3.20,(a) 您应该是,但 (b) 您可以尝试使用早期版本。但是从不将版本低于您测试的版本。 CMake 只能向后兼容,不能向前兼容。

如果你只需要freetype作为imgui的依赖,那么你可以在CMakeLists.txt中去掉对它的引用。

要构建它,您将想要使用 vcpkg。为此,在您的 CMakeLists.txt 旁边创建一个名为 vcpkg.json 的文件,其中包含以下内容:


  "name": "learn-opengl",
  "version": "0.1.0",
  "dependencies": [
    "glfw3",
    "glad",
    "glm",
    "freetype",
    "stb",
    
      "name": "imgui",
      "features": ["freetype", "glfw-binding", "opengl3-glad-binding"]
    
  ]

这只是告诉vcpkg 您想要哪些依赖项,以及您希望使用freetype 支持和glfw 绑定构建imgui

那么你只需要运行三个命令。

$ git clone https://github.com/microsoft/vcpkg.git
$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_TOOLCHAIN_FILE=$PWD/vcpkg/scripts/buildsystems/vcpkg.cmake
$ cmake --build build

这里唯一可能出乎意料的是设置CMAKE_TOOLCHAIN_FILE,这只是告诉CMake 使用vcpkg。第一次运行时,vcpkg 将下载您的依赖项,构建它们,将它们缓存在~/.cache/vcpkg 中并将它们安装到您的构建文件夹中。后续运行将构建只是您的代码。

这个序列在我的 Ubuntu 20.04 LTS 机器上成功地为我构建了你的代码。


为简化此操作,请考虑在您的根目录中创建一个 CMakePresets.json 文件,其中包含以下内容:


  "version": 2,
  "cmakeMinimumRequired": 
    "major": 3,
    "minor": 20,
    "patch": 0
  ,
  "configurePresets": [
    
      "name": "default",
      "displayName": "Default Config",
      "description": "Default build using Make and vcpkg",
      "generator": "Unix Makefiles",
      "binaryDir": "$sourceDir/build",
      "cacheVariables": 
        "CMAKE_BUILD_TYPE": "Release",
        "CMAKE_TOOLCHAIN_FILE": "$sourceDir/vcpkg/scripts/buildsystems/vcpkg.cmake"
      
    ,
    
      "name": "default-msvc",
      "displayName": "Default MSVC",
      "description": "Default build using Visual Studio and vcpkg",
      "generator": "Visual Studio 16 2019",
      "binaryDir": "$sourceDir/build",
      "cacheVariables": 
        "CMAKE_TOOLCHAIN_FILE": "$sourceDir/vcpkg/scripts/buildsystems/vcpkg.cmake"
      
    
  ]

然后你可以只运行cmake --preset=default 而不是上面更长的命令。

【讨论】:

我确实喜欢你的回答,但同时不喜欢,当我创建我的项目时,我想做的第一件事就是从源代码构建所有内容,以避免安装库和库。并且 Glad & ImGUI 没有 cmake 实现。还是谢谢 vcpkg 确实从源代码编译。您尝试从源代码编译的方式将不起作用,因为这只是架构上的 CMake 操作方式。 我会尝试并在我设法让它工作时回到你身边 看,CMake 已经完成,所以可能有一些方法可以让它工作。不值得您(或任何人)花时间这样做。坚持最糟糕的过程不会让你走得太远。如果您不想使用 vcpkg,您可以执行它的操作:下载每个依赖项并将它们全部安装到一个公共前缀,然后使用 build 调用(与上面完全相同的 CMakeLists)并设置 CMAKE_PREFIX_PATH 我听从了你的回答,但我收到一条错误消息:CMakeLists.txt:5 (find_package) 的 CMake 错误:通过在 CMAKE_MODULE_PATH 中不提供“Findglfw3.cmake”,该项目已要求 CMake 查找包“glfw3”提供的配置文件,但 CMake 没有找到。找不到由“glfw3”提供的具有以下任何名称的包配置文件:glfw3Config.cmake glfw3-config.cmake

以上是关于我如何在 CMAKE 中链接 GLFW 和 Dear ImGUI的主要内容,如果未能解决你的问题,请参考以下文章

设置 Eclipse 链接器以编译和运行 GLFW 应用程序 - 如何?

无法将 Glew 与 Cmake 链接

在 Mac 上使用 CMake 的 GLFW

使用 CMAKE 构建 GLFW3 应用程序 - GLFW LIBRARIES 未设置

如何使用cmake在mac上链接OpenGL相关库?

如何将 GLEW 和 GLFW 以及 OpenGL 链接到 MingW 的 g++