CMake:不同平台的OpenGL包含目录名称不同。

5

Cmake会为OpenGL找到包含目录,但是OpenGL的头文件在不同平台(或许还有不同编译器)下有不同的子目录名称:Windows下为gl,Linux下为GL,Mac下为OpenGL(据我所知)。因此,将OPENGL_INCLUDE_DIRECTORY添加到包含路径中并不能很好地解决问题——我仍然需要在我的源代码中包含<GL/gl.h>(或者<gl/gl.h>等等)。

我该如何处理这个问题?


你尝试过使用命令 find_package(OpenGL) 吗?从你的问题中我不清楚你是否已经尝试过了。 - Morwenn
当然了。如果没有这个,OPENGL_INCLUDE_DIRECTORY变量就会为空。 - lisyarus
好的,我的错,我不确定。那么,除了强制用户重命名他们的目录之外,我认为没有通用的方法。但是我觉得很奇怪:无论操作系统如何,我只看到过GL目录。 - Morwenn
至少我确定在Windows上是“gl”,而在Linux上是“GL”。有一个解决方案可以编写类似于CMake的FindOpenGL模块,但它很丑陋,因为它几乎会执行此模块实际上要执行的操作。 - lisyarus
1个回答

7
我猜你的意思是 OPENGL_INCLUDE_DIRECTORY,而不是 OPENGL_INCLUDE_DIR
你有几个选择。最简单的方法是将 ${OPENGL_INCLUDE_DIR}/GL${OPENGL_INCLUDE_DIR}/OpenGL 添加到包含搜索路径中并使用。
#include "gl.h"

在你的源代码中。

Windows操作系统不区分文件名的大小写,因此您不需要使用/gl /GL - 只需使用/GL即可。

要实现这一点,在您的CMakeLists.txt中执行以下操作:

if(APPLE)
  include_directories(${OPENGL_INCLUDE_DIR}/OpenGL)
else()
  include_directories(${OPENGL_INCLUDE_DIR}/GL)
endif()

为了使这个更加健壮,你可以让CMake找到 "gl.h" 的路径并包含它:
find_path(OpenglIncludeSubdir
            NAMES gl.h
            PATHS ${OPENGL_INCLUDE_DIR}
            PATH_SUFFIXES GL OpenGL
            NO_DEFAULT_PATH)
include_directories(${OpenglIncludeSubdir})

同样,在你的源代码中,你会使用:

#include "gl.h"

可能最健壮的方法(即避免超出${OPENGL_INCLUDE_DIR})是找到“gl.h”的路径,然后使用configure_file来应用正确的#include术语。您将使用一个包含以下内容的输入文件:

#include "@OpenglSubdir@/gl.h"

然后运行configure_file,它会将@OpenglSubdir@替换为其值并将内容写入输出文件。这个输出文件将被包含在您的目标中,并且将具有

#include "GL/gl.h"

或者

#include "OpenGL/gl.h"

为了实现这一点,您可以像这样操作:

适当时执行以下操作:

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)

非常感谢,现在看来我有很多解决方案了 :) - lisyarus
2
不幸的是,似乎这在Windows上无法工作,因为CMake显然没有在Windows上设置OPENGL_INCLUDE_DIR。根据这篇2004年9月的邮件列表帖子,这似乎是一个有意的决定,并且似乎在过去的十年中没有改变。 - awksp

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