Cmake会为OpenGL找到包含目录,但是OpenGL的头文件在不同平台(或许还有不同编译器)下有不同的子目录名称:Windows下为gl,Linux下为GL,Mac下为OpenGL(据我所知)。因此,将OPENGL_INCLUDE_DIRECTORY添加到包含路径中并不能很好地解决问题——我仍然需要在我的源代码中包含<GL/gl.h>(或者<gl/gl.h>等等)。
我该如何处理这个问题?
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()
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)
OPENGL_INCLUDE_DIR
。根据这篇2004年9月的邮件列表帖子,这似乎是一个有意的决定,并且似乎在过去的十年中没有改变。 - awksp
find_package(OpenGL)
吗?从你的问题中我不清楚你是否已经尝试过了。 - MorwennGL
目录。 - Morwenn