CMake:opengl包括dirs在不同平台上的命名方式不同

lis*_*rus 5 opengl cmake include

Cmake创建了包含opengl的目录,但是opengl头文件位于不同平台(也可能是编译器)上的不同命名子目录:Windows上的gl,Linux上的GL,Mac上的OpenGL(据我所知).因此,添加OPENGL_INCLUDE_DIRECTORY以包含路径并没有多大帮助 - 我仍然必须在我的源中包含(或等等).我该怎么处理呢?

Fra*_*ser 6

我认为你的意思是OPENGL_INCLUDE_DIR,而不是OPENGL_INCLUDE_DIRECTORY.

你有几个选择.最简单的是添加${OPENGL_INCLUDE_DIR}/GL${OPENGL_INCLUDE_DIR}/OpenGL包含搜索路径和使用

#include "gl.h"
Run Code Online (Sandbox Code Playgroud)

在你的源代码中.

在Windows上忽略了文件名的情况,因此您不需要使用/gl /GL - 只是/GL会这样做.

为此,在您的CMakeLists.txt中执行以下操作:

if(APPLE)
  include_directories(${OPENGL_INCLUDE_DIR}/OpenGL)
else()
  include_directories(${OPENGL_INCLUDE_DIR}/GL)
endif()
Run Code Online (Sandbox Code Playgroud)


为了使其更加健壮,您可以让CMake找到"gl.h"的路径并包括:

find_path(OpenglIncludeSubdir
            NAMES gl.h
            PATHS ${OPENGL_INCLUDE_DIR}
            PATH_SUFFIXES GL OpenGL
            NO_DEFAULT_PATH)
include_directories(${OpenglIncludeSubdir})
Run Code Online (Sandbox Code Playgroud)

同样,在您的来源中,您将使用:

#include "gl.h"
Run Code Online (Sandbox Code Playgroud)


可能最强大(即避免进一步包括超出路径${OPENGL_INCLUDE_DIR})将是找到"gl.h"的路径然后用于configure_file应用正确的#include术语.您将使用包含以下内容的输入文件:

#include "@OpenglSubdir@/gl.h"
Run Code Online (Sandbox Code Playgroud)

然后运行configure_file将替换@OpenglSubdir@为其值并将内容写入输出文件.然后,此输出文件将包含在您的目标中并具有

#include "GL/gl.h"
Run Code Online (Sandbox Code Playgroud)

要么

#include "OpenGL/gl.h"
Run Code Online (Sandbox Code Playgroud)

作为适当的.

要实现这一目标,您需要执行以下操作:

find_file(OpenglSubdir
            NAMES GL OpenGL
            PATHS ${OPENGL_INCLUDE_DIR}
            NO_DEFAULT_PATH)
get_filename_component(OpenglSubdir ${OpenglSubdir} NAME)
configure_file(${CMAKE_SOURCE_DIR}/my_config.h.in ${CMAKE_SOURCE_DIR}/my_config.h)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这似乎不适用于Windows,因为CMake显然没有在Windows上设置`OPENGL_INCLUDE_DIR`.这似乎是一个深思熟虑的决定,基于[2004年9月邮件列表帖子](https://cmake.org/pipermail/cmake/2004-September/005508.html),似乎没有改变中间十年. (2认同)