我在OS X 10.10上并尝试建立一个C'项目'使用GLUT和OpenGL。
我把它简化为一个展示我问题的最小例子。我有以下CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8)
FIND_PACKAGE(OpenGL REQUIRED)
FIND_PACKAGE(GLUT REQUIRED)
if(OpenGL_FOUND) # never true, but printed as true
link_directories(${OpenGL_LIBRARY_DIRS})
include_directories(${OpenGL_INCLUDE_DIR})
endif(OpenGL_FOUND)
if(GLUT_FOUND)
link_directories(${GLUT_LIBRARY_DIR})
include_directories(${GLUT_INCLUDE_DIR})
endif(GLUT_FOUND)
# print all vars because wtf
get_cmake_property(_v VARIABLES)
foreach(_v ${_v})
message(STATUS "${_v}=${${_v}}")
endforeach()
add_executable(main main.c)
target_link_libraries(main ${GLUT_LIBRARY} ${OPENGL_LIBRARY})
main.c
只是一个假人,包括两个标题:
#include <gl.h>
#include <glut.h>
int main()
{
return 0;
}
现在,cmake .
运行正常,出于调试目的,打印所有变量。我从某个地方拿了代码,我不太了解cmake知道它是否按照我的想法行事。无论如何,运行make
返回
main.c:1:10: fatal error: 'gl.h' file not found
#include <gl.h>
^
1 error generated.
标头gl.h
实际上存在于/System/Library/Frameworks/OpenGL.framework/Headers
中,因此应该由cmake找到,特别是因为glut.h
处于相同的结构中(只需用GLUT替换OpenGL)并找到正好。另外,令我感到困惑的是,if(GLUT_FOUND)...
中的块永远不会被执行(尝试将message
语句放入其中),但在打印的变量中它表示OPENGL_FOUND=TRUE
。但是删除if条件不会改变任何东西。
实际问题:到底是怎么回事?为什么a)cmake除非特别包含,否则找不到标题,b)尽管OPENGL_FOUND
打印为TRUE,if-block仍未执行,c)glut.h
没有出现此类问题?花了好几个小时,无法理解为什么。
答案 0 :(得分:8)
这很常见
#if defined(__APPLE__)
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#endif
您可以在glfw,glew,sfml等中以某种形式看到这种情况
答案 1 :(得分:2)
我很惊讶您在OS X 10.10的/System/Library/Frameworks
中找到了OpenGL标头。我不认为它们已经在很多Xcode版本中安装了。在10.10上使用Xcode 6.1的最新头文件应该在:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers
除非您想查看标题,否则您根本不需要知道此路径。我相信编译器会自动使用与您正在编译的操作系统相匹配的SDK。如果由于某种原因您想要为不同的平台构建,则可以使用-isysroot
编译器选项覆盖该逻辑。
对于来自框架的头文件,您在#include
语句中使用的命名是:
#include <FrameworkName/HeaderFileName.h>
编译器会将此解析为框架内标头的实际路径名。
因此,如果要从OpenGL框架中使用当前的OpenGL标头gl3.h
,则正确的include语句为:
#include <OpenGL/gl3.h>
这将使您可以访问支持最高的OpenGL版本的核心配置文件(如果您有一个合理的新Mac,则为3.x或4.x)。或者,如果您想将OpenGL 2.1与旧版功能一起使用:
#include <OpenGL/gl.h>
答案 2 :(得分:0)
正如bei pmr所指出的,CMake变量区分大小写,因此必须查询变量OPENGL_FOUND
。
另外,正如PeterT所写,标题在OS X上包含为#include <OpenGL/gl.h>
。
答案 3 :(得分:0)
在更新从自制软件安装的qt之后,我最终遇到了这个问题,并且出现了相同的错误消息。根据Reto的评论,我将CMAKE_OSX_SYSROOT更新为None
,一切恢复正常。