oar*_*ish 3 c opengl macos cmake
我在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})
Run Code Online (Sandbox Code Playgroud)
这main.c只是一个包含两个标题的假人:
#include <gl.h>
#include <glut.h>
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,cmake .运行正常并且为了调试目的打印所有变量.我从某个地方拿了代码,我不太了解cmake知道它是否按照我的想法行事.无论如何,运行make返回
main.c:1:10: fatal error: 'gl.h' file not found
#include <gl.h>
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
标题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-block不执行虽然OPENGL_FOUND打印为TRUE,c)没有出现这样的问题glut.h?花了好几个小时,无法理解为什么.
Pet*_*erT 10
这很常见
#if defined(__APPLE__)
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else
#include <GL/gl.h>
#include <GL/glu.h>
#endif
Run Code Online (Sandbox Code Playgroud)
您可以在glfw,glew,sfml等中以这种或那种形式看到这种情况
我很惊讶您在/System/Library/FrameworksOS X 10.10 中发现了 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>
Run Code Online (Sandbox Code Playgroud)
编译器会将其解析为框架内标头的实际路径名。
因此,如果您想使用当前的 OpenGL 标头,即gl3.h来自 OpenGL 框架的 ,正确的 include 语句是:
#include <OpenGL/gl3.h>
Run Code Online (Sandbox Code Playgroud)
这将使您能够访问支持的最高 OpenGL 版本的核心配置文件(如果您有一台相当新的 Mac,则为 3.x 或 4.x)。或者,如果您想使用具有旧功能的 OpenGL 2.1:
#include <OpenGL/gl.h>
Run Code Online (Sandbox Code Playgroud)
正如 pmr 所指出的,CMake 变量区分大小写,因此OPENGL_FOUND必须查询该变量。#include <OpenGL/gl.h>此外,正如 PeterT 所写,标头也像OS X 上一样包含在内。
| 归档时间: |
|
| 查看次数: |
8577 次 |
| 最近记录: |