2015-05-27 7 views
2

Я работаю над программой на C++, которую я разрабатываю на своей личной машине Ubuntu 15.04, которая в конечном итоге должна работать на openSUSE 13.1 на работе. Чтобы он работал на обеих системах, я тщательно выбрал библиотеки и версии для использования.Включая заголовки в подпапках

Теперь у меня есть проблема с включениями. Я хочу использовать Qwt 6, который доступен для обоих дистрибутивов. Однако расположение файлов заголовков отличается. На Debian они находятся на /usr/include/qwt/qwt_*.h, но на openSUSE они находятся на /usr/include/qwt6/qwt_*.h. В моем коде в настоящее время есть #include <qwt/qwt_plot.h>. Это не работает на openSUSE, так как мне нужно будет вставить этот 6.

Простейшее решение, которое я сейчас вижу, включает в себя либо любую директорию, использующую CMake, а затем просто записывая #include <qwt_plot.h> в исходный код. Тем не менее, я думаю, что это не очень хорошее решение, поскольку эти подкаталоги /usr/include предназначены для предоставления пространств имен. Просто добавление всех каталогов в путь включения приведет к их сглаживанию и может привести даже к конфликтам.

Есть ли хороший способ решить эту проблему?

Справедливости ради. Для проекта мне платят за работу.

+2

Вы могли бы сделать трюки с символическими ссылками, например. Какой компилятор вы используете? Возможно, это поможет определить, какие каталоги использовать компилятор, а затем изменить с #include Marged

+0

, или вы можете сделать что-то довольно уродливое с препроцессором, как показано там: http: // stackoverflow .com/questions/3178946/using-define-to-include-another-file-in-cc – Marged

+0

@Marged: символические ссылки потребуют доступа root к каталогу '/ usr/include', который я не хочу их принуждать чтобы дать мне это. Я использую g ++ для обоих распределений, 4.9 на Ubuntu и 4.8 на openSUSE. Макросы не выглядят лучше, чем просто «». –

ответ

1

В CMake вы можете настроить проверку платформы, как вы могли, для autoconf. Идея состоит в том, что вы включаете файл config.h, который всегда существует, но используйте инструменты для создания этого файла на каждой платформе. Вы можете проверить, как here, но в сводке вы можете получить файл config.h.in с чеками, которые вы хотите сделать и использовать в своих заголовках.

#cmakedefine HAVE_QWT_H 
#cmakedefine HAVE_QWT6_H 

Затем вы должны проверить, если CMake заголовки присутствуют и процесс этот файл в конечный config.h файл. В файле CMakeLists.txt у вас может быть следующее.

INCLUDE (CheckIncludeFiles) 

CHECK_INCLUDE_FILES (qwt/qwt_plot.h HAVE_QWT_H) 
CHECK_INCLUDE_FILES (qwt6/qwt_plot.h HAVE_QWT6_H) 
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) 

Наконец, в заголовках, вы включите config.h и использовать макросы условно включать один заголовок или другой.

// always included 
#include "config.h" 

// conditionally include headers based one macros from config.h 
#ifdef HAVE_QWT_H 
#include <qwt/qwt_plot.h> 
#elseif HAVA_QWT6_H 
#include <qwt6/qwt_plot.h> 
#else 
#error QWT headers required and not present in supported locations 
#endif 
+0

Спасибо, я вижу, где это происходит. Это просто приведет к распространению этих макросов в моих исходных файлах. К счастью, это не нужно масштабировать до третьего дистрибутива или даже другой платформы, но я действительно не ставил все эти макросы в свои заголовки: - /. –

+0

Да, это беспорядок. Тем не менее я помню, что CMake является частью инструмента третьего или четвертого поколения, пытающегося упростить эту задачу. :) – m4ktub