2013-04-24 37 views
5

Cmake founds bao gồm thư mục cho opengl, nhưng tiêu đề opengl nằm trong thư mục con được đặt tên khác nhau trên các nền tảng khác nhau (và, có thể, trình biên dịch): gl trên Windows, GL trên Linux , OpenGL (theo như tôi biết) trên Mac. Do đó, việc thêm OPENGL_INCLUDE_DIRECTORY để bao gồm các đường dẫn không giúp ích nhiều - tôi vẫn phải bao gồm (hoặc, v.v) trong các nguồn của mình. Tôi nên giải quyết nó như thế nào?CMake: opengl bao gồm dirs được đặt tên khác nhau trên các nền tảng khác nhau

+0

Bạn đã thử các lệnh 'find_package (OpenGL)'? Tôi không hiểu câu hỏi của bạn mà bạn đã làm hay không. – Morwenn

+0

Tất nhiên là tôi đã làm. Nếu không có biến OPENGL_INCLUDE_DIRECTORY sẽ trống. – lisyarus

+0

Ok, xấu của tôi, tôi không chắc chắn. Sau đó, tôi không nghĩ rằng có bất kỳ phương pháp chung chung bên cạnh việc buộc người dùng phải đổi tên thư mục của họ. Nhưng tôi thấy nó khá lạ: Tôi chỉ thấy thư mục 'GL', bất kể hệ điều hành nào. – Morwenn

Trả lời

6

Tôi giả sử bạn có nghĩa là OPENGL_INCLUDE_DIR, không phải OPENGL_INCLUDE_DIRECTORY.

Bạn có một vài lựa chọn ở đây. Cách đơn giản nhất là thêm ${OPENGL_INCLUDE_DIR}/GL hoặc ${OPENGL_INCLUDE_DIR}/OpenGL để bạn bao gồm những con đường tìm kiếm và sử dụng

#include "gl.h" 

trong mã nguồn của bạn.

Trường hợp của tên tập tin được bỏ qua trên Windows, do đó bạn không cần phải sử dụng /gl/GL - chỉ đơn giản là /GL sẽ làm.

Để đạt được điều này, trong CMakeLists.txt bạn làm:

if(APPLE) 
    include_directories(${OPENGL_INCLUDE_DIR}/OpenGL) 
else() 
    include_directories(${OPENGL_INCLUDE_DIR}/GL) 
endif() 


Để làm điều này mạnh mẽ hơn một chút, bạn có thể có CMake tìm đường dẫn đến "gl.h" và bao gồm rằng:

find_path(OpenglIncludeSubdir 
      NAMES gl.h 
      PATHS ${OPENGL_INCLUDE_DIR} 
      PATH_SUFFIXES GL OpenGL 
      NO_DEFAULT_PATH) 
include_directories(${OpenglIncludeSubdir}) 

Một lần nữa, trong mã nguồn của bạn, bạn muốn sử dụng:

#include "gl.h" 


Có thể mạnh mẽ nhất (tức là tránh xa hơn bao gồm các đường dẫn bên ngoài ${OPENGL_INCLUDE_DIR}) sẽ tìm đường dẫn đến "gl.h" và sau đó sử dụng configure_file để áp dụng cụm từ #include chính xác. Bạn sẽ sử dụng một tập tin đầu vào trong đó có cái gì đó như:

#include "@[email protected]/gl.h" 

và sau đó chạy configure_file sẽ thay thế @[email protected] với giá trị của nó và viết nội dung vào một tập tin đầu ra. tập tin đầu ra này sau đó sẽ được đưa vào mục tiêu của bạn và sẽ có

#include "GL/gl.h" 

hoặc

#include "OpenGL/gl.h" 

cho phù hợp.

Để đạt được điều này, bạn muốn làm điều gì đó như:

find_file(OpenglSubdir 
      NAMES GL OpenGL 
      PATHS ${OPENGL_INCLUDE_DIR} 
      NO_DEFAULT_PATH) 
get_filename_component(OpenglSubdir ${OpenglSubdir} NAME) 
configure_file(${CMAKE_SOURCE_DIR}/my_config.h.in ${CMAKE_SOURCE_DIR}/my_config.h) 
+0

Cảm ơn rất nhiều, có vẻ như tôi có rất nhiều giải pháp ngay bây giờ :) – lisyarus

+2

Thật không may, có vẻ như điều này sẽ không hoạt động với Windows, vì CMake dường như không đặt 'OPENGL_INCLUDE_DIR' trên Windows. Đây có vẻ là một quyết định có chủ ý, dựa trên [danh sách gửi thư tháng 9 năm 2004 này] (https://cmake.org/pipermail/cmake/2004-September/005508.html), và có vẻ như điều đó đã không thay đổi thập kỷ can thiệp. – awksp

Các vấn đề liên quan