我在 OS X 10.10 上并尝试使用 GLUT 和 OpenGL 构建一个 C“项目”。
我将其简化为展示我的问题的最小示例。我有以下内容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})
The main.c
只是一个包含两个标头的虚拟对象:
#include <gl.h>
#include <glut.h>
int main()
{
return 0;
}
Now, cmake .
运行良好并出于调试目的打印所有变量。我从某处获取了代码,我对 cmake 的了解不够,不知道它是否按照我的想法进行。无论如何,跑步make
returns
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) 尽管 if 块不执行OPENGL_FOUND
打印为 TRUE,c) 不会出现此类问题glut.h
?花了几个小时在这上面,但无法理解为什么。