我在使用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})
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) if块不执行,尽管OPENGL_FOUND
打印为TRUE,c)使用glut.h
时不会出现这些问题?花了几个小时还是搞不清楚为什么。
OPENGL_FOUND
。对于所有其他变量也是如此。使用大写字母OPENGL
。FindOpenGL
也不会设置LIBRARY_DIR
。你真的在查看文档吗? - pmrOPENGL_LIBRARIES
的变量,我已经尝试过了,但问题并不在链接步骤上。 - oarfishmake VERBOSE=1
来查看完整的编译器调用吗?它是否包含正确的包含目录?如果所有方法都失败了,请删除CMakeCache。 - pmrOPENGL_FOUND
为真,而路径实际上并不存在于编译器调用中的原因。我也总是删除缓存并从头开始重建,以摆脱这个混淆因素。 - oarfish