cmake ne trouve pas gl.h sur OS X

Je suis sous OS X 10.10 et j’essaie de construire un ‘projet’ C avec GLUT et OpenGL. Je l’ai réduit à un exemple minimal illustrant mon problème. J’ai le CMakeLists.txt suivant:

 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}) 

Le main.c est juste un mannequin comprenant deux en-têtes:

 #include  #include  int main() { return 0; } 

Maintenant, cmake . fonctionne correctement et à des fins de débogage imprime toutes les variables. J’ai pris le code quelque part, je ne sais pas assez sur cmake pour savoir s’il fait ce que je pense qu’il est. Quoi qu’il en soit, courir make retours

 main.c:1:10: fatal error: 'gl.h' file not found #include  ^ 1 error generated. 

L’en-tête gl.h est actuellement présent dans / /System/Library/Frameworks/OpenGL.framework/Headers / /System/Library/Frameworks/OpenGL.framework/Headers / /System/Library/Frameworks/OpenGL.framework/Headers / /System/Library/Frameworks/OpenGL.framework/Headers / /System/Library/Frameworks/OpenGL.framework/Headers et doit donc être trouvé par cmake, d’autant plus que glut.h est dans la même structure (remplace simplement OpenGL par GLUT) et se trouve ça va. De plus, ce qui me if(GLUT_FOUND)... c’est que le bloc dans if(GLUT_FOUND)... n’est jamais exécuté (essayez d’y insérer une instruction de message ), mais parmi les variables imprimées, il est indiqué que OPENGL_FOUND=TRUE . Mais supprimer la condition préalable ne change rien.

La vraie question: qu’est-ce qui se passe? Pourquoi a) cmake ne trouve-t-il pas l’en-tête sauf si spécifiquement inclus, b) le bloc if n’est pas exécuté alors que OPENGL_FOUND TRUE, c) aucun problème de ce type ne se produit avec glut.h ? J’ai passé des heures à cela et je ne peux pas comprendre pourquoi.

Il est commun de faire

 #if defined(__APPLE__) #include  #include  #else #include  #include  #endif 

Vous pouvez voir cela se faire sous une forme ou une autre dans glfw, glew, sfml et autres

Je suis surpris que vous ayez trouvé des en-têtes OpenGL dans /System/Library/Frameworks sous OS X 10.10. Je ne pense pas qu’ils aient été installés là-bas dans quelques versions de Xcode. Les fichiers d’en-tête les plus récents avec Xcode 6.1 sur 10.10 doivent figurer dans:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers

Vous n’avez pas vraiment besoin de connaître ce chemin, sauf si vous voulez regarder les en-têtes. Je pense que le compilateur utilise automatiquement le SDK correspondant au système d’exploitation sur lequel vous comstackz. Si, pour une raison quelconque, vous souhaitez créer pour une autre plate-forme, vous pouvez remplacer cette logique avec l’option de compilation -isysroot .

Avec les fichiers d’en-tête provenant d’un framework, le nom que vous utilisez dans votre instruction #include est:

 #include  

Le compilateur résoudra ce problème en indiquant le chemin d’access réel de l’en-tête dans la structure.

Par conséquent, si vous souhaitez utiliser l’en-tête OpenGL actuel, qui correspond à gl3.h , à partir du framework OpenGL, l’instruction include correcte est:

 #include  

Cela vous donnera access au profil de base de la version OpenGL prise en charge la plus élevée (qui est 3.x ou 4.x si vous avez un nouveau Mac raisonnablement nouveau). Ou si vous souhaitez utiliser OpenGL 2.1 avec des fonctionnalités héritées:

 #include  

Comme il a été souligné avant pmr, les variables CMake sont sensibles à la casse. La variable OPENGL_FOUND doit donc être interrogée. De plus, comme l’a écrit PeterT, l’en-tête est inclus sous #include sur OS X.