Включить только определенные библиотеки в операционной системе - PullRequest
3 голосов
/ 22 сентября 2008

При написании приложения, которое требуется компилировать на Mac, Linux и Windows, каков наилучший способ управления различными библиотеками, которые необходимо будет включить в различные операционные системы. Например, использование инструментария glut opengl требует разных включений в каждой операционной системе.

Ответы [ 8 ]

2 голосов
/ 22 сентября 2008

Ваш вопрос на самом деле два вопроса в одном:

1) Как мне написать свой код C ++ для включения правильных включаемых файлов на нужной платформе?

2) Как мне написать свой Makefile для работы на разных платформах?

На вопрос о коде C ++ уже дан ответ - найдите определения для конкретной платформы и используйте их, чтобы выяснить, на какой платформе вы находитесь.

Automake или scons довольно сложны и стоят вашего времени, только если вы собираетесь выпустить свой код для широкой аудитории. В случае внутреннего кода обычно достаточно «универсального» make-файла с включением для каждой платформы. Для Windows вы можете получить GNU Make для Windows (доступно по адресу здесь , или использовать nmake и ограничиться набором синтаксиса, общим для всех платформ.

1 голос
/ 22 сентября 2008

Если вам просто нужно беспокоиться о заголовочных файлах, то препроцессор сделает все, что вам нужно. Если вы хотите обрабатывать разные исходные файлы и, возможно, разные библиотеки, вам понадобится инструмент для их обработки.

Некоторые опции включают в себя:

Мой личный фаворит - CMake. В Autotools используется многоэтапный процесс, который относительно легко сломать, и scons просто кажется мне странным. Cmake также генерирует файлы проектов для различных IDE, в дополнение к файлам make.

1 голос
/ 22 сентября 2008

Хорошая статья о Макросах . Один из ответов о том, как использовать условную компиляцию на основе OS / COmpiler (он находится вверху).

Использование инструментов автоконфигурации является хорошим дополнением к этому, но оно не требуется для небольших проектов, где может быть проще обнаружить ОС явно, хотя для более крупных проектов, которые могут потребоваться для запуска на многих различных типах ОС Вам также следует изучить Доступные инструменты автоконфигурации, упомянутые Branan

0 голосов
/ 22 сентября 2008

Возможно, это ответ отговорки, но вы смотрели, как буст справляется с этим? Они построены на нескольких платформах без autoconf, хотя у них есть своя собственная система сборки - bjam - которая, вероятно, справляется с некоторыми из тех же ситуаций. Они также делают хороший трюк с автоматической связью в окнах, который автоматически выбирает правильную версию библиотек для связывания в зависимости от версии компилятора MSVC. Исходя из вашего первоначального описания, это звучит так, как будто проверка макросов для различных платформ / компиляторов может помочь, но, возможно, есть и другие проблемы, которые могут это предотвратить.

0 голосов
/ 22 сентября 2008

Если библиотеки предлагают один и тот же API на разных платформах, я бы создал включаемый файл «прокси», содержащий все необходимые #ifdef s. Этот «независимый от платформы» включаемый файл затем включается в ваш клиентский код вместо того, чтобы загромождать его многочисленными и неприглядными командами препроцессора. Они будут содержаться в безобразном и загроможденном независимом от платформы включении.

Если API отличается на разных платформах, вам необходимо создать собственную абстракцию.

0 голосов
/ 22 сентября 2008

Компилятор должен иметь набор символов препроцессора, который он предоставит для использования. Например, linux для gcc в системе Linux, _WIN32 для VC ++. Если вам нужно что-то более сложное, посмотрите на autoconf , но это лучше всего подходит для кода на основе Unix.

Я бы порекомендовал проверить, как некоторые крупные проекты OpenSource справляются с этим. См. AutoSense.hpp из (старой версии) Apache Xerces.

0 голосов
/ 22 сентября 2008

Scons имеет механизм настройки, который сделает многое из того, что делают автоинструменты без такой большой сложности, и чертовски переносим (хотя и не так переносим, ​​как автоинструменты).

0 голосов
/ 22 сентября 2008

В нескольких проектах, над которыми я работал, используется скрипт конфигурирования на основе autoconf, который создает Makefile, поэтому вы можете собрать их все из исходного кода с помощью простого:

./configure
make
make install
...