【发布时间】:2014-11-04 21:22:53
【问题描述】:
我在 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 具有相同的结构(只需将OpenGL 替换为GLUT)并且发现很好。此外,令我困惑的是if(GLUT_FOUND)... 中的块从未执行(尝试将message 语句放入其中),但在打印的变量中它显示OPENGL_FOUND=TRUE。但是删除 if 条件不会改变任何事情。
真正的问题:到底发生了什么?为什么 a) cmake 找不到标头,除非特别包含,b) 尽管 OPENGL_FOUND 打印为 TRUE,但 if 块不执行,c) glut.h 没有出现此类问题?花了几个小时在这上面,无法理解为什么。
【问题讨论】:
-
正确的变量是
OPENGL_FOUND。对于所有其他变量也是如此。使用大写的OPENGL。FindOpenGL也没有设置LIBRARY_DIR。你真的在看文档吗? -
大写或否在这里没有任何区别。我也不确定它是否确实(?)关于变量:是的,我已经尝试了几件事。例如它确实声明了一个变量
OPENGL_LIBRARIES,我试过了,但问题不在于这里的链接步骤。 -
是的,cmake 变量区分大小写。尝试使用正确的
OPENGL_INCLUDE_DIR。在 MacOS 上使用 CMake,这应该是gl.h的完整路径。问题是 Mac OS 上的框架有奇怪的包含路径。 -
是的,我也试过了,那个变量打印的值是正确的,但是——令我惊讶的是——我得到了上面提到的那个错误。
-
我必须恢复我之前的陈述,正如您所说,大写
OPENGL_FOUND确实有所作为。我否认了这一点,因为我以前曾尝试过,但要知道是否有用。所以肯定有一些令人困惑的变量发生了变化。