2014-11-04 306 views
3

我在OS X 10.10上,嘗試用GLUT和OpenGL構建C'項目。 我將它簡化爲展示我的問題的最小示例。我有以下CMakeLists.txtcmake在OS X上找不到gl.h的文件

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塊不能執行,c)glut.h不會出現這種問題?在這花了幾個小時,無法理解爲什麼。

+1

正確的變量是'OPENGL_FOUND'。所有其他變量也是如此。使用大寫的'OPENGL'。 'FindOpenGL'也不設置'LIBRARY_DIR'。你真的在看文檔嗎? – pmr 2014-11-04 21:42:09

+0

大寫或無在這裏沒有任何區別。我也不確定它是否可以(?) 關於變量:是的,我嘗試了幾件事情。比如它聲明瞭一個變量'OPENGL_LIBRARIES',我試過了,但問題不在於這裏的連接步驟。 – oarfish 2014-11-04 22:02:47

+0

是的,cmake變量是區分大小寫的。嘗試使用正確的'OPENGL_INCLUDE_DIR'。對於MacOS上的CMake,這應該是'gl.h'的完整路徑。問題是Mac OS上的框架有很奇怪的包含路徑。 – pmr 2014-11-04 22:25:03

回答

0

正如指出的貝PMR,CMake的變量是大小寫敏感的,所以變量OPENGL_FOUND必須進行查詢。 另外,正如PeterT寫的,標題在OS X上包含爲#include <OpenGL/gl.h>

7

這是常見的做

#if defined(__APPLE__) 
#include <OpenGL/gl.h> 
#include <OpenGL/glu.h> 
#else 
#include <GL/gl.h> 
#include <GL/glu.h> 
#endif 

你可以看到這是一個形式做或那樣GLFW,GLEW,SFML和其他

+0

奇怪的是,它與'一起工作,儘管我確信我已經嘗試過了。您能否詳細說明包含過程的工作原理,即爲什麼當頭文件不在具有該名稱的目錄中,而是位於前面提到的.framework/Headers目錄中時,爲什麼要加前綴「OpenGL」? – oarfish 2014-11-04 22:05:43

2

我很驚訝,你發現OpenGL的頭在/System/Library/Frameworks在OS X 10.10。我不認爲他們已經安裝在很多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頭,這是gl3.h,從OpenGL的框架,正確的包括語句:

#include <OpenGL/gl3.h> 

這將使你獲得的最高的核心配置文件支持OpenGL版本(如果您擁有合理的新Mac,則爲3.x或4.x)。或者,如果你想使用的OpenGL 2.1與傳統的特點:

#include <OpenGL/gl.h> 
+0

我沒有安裝Xcode,當意識到cmdline工具可以單獨安裝時,我放棄了它。但是,如果我使用上面的cmake文件並更正了'OpenGL_FOUND'的外殼,雖然我只使用'#include '而沒有框架名稱(''也可以),但可以找到標題。 – oarfish 2014-11-05 12:12:37