Включить только определенные библиотеки в операционной системе

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


person Paul Wicks    schedule 22.09.2008    source источник


Ответы (8)


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

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

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

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

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

person Community    schedule 22.09.2008

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

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

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

person Branan    schedule 22.09.2008

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

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

person Martin York    schedule 22.09.2008

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

./configure
make
make install
person Jonathan Rupp    schedule 22.09.2008

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

person Ben Collins    schedule 22.09.2008

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

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

person Rob Walker    schedule 22.09.2008

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

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

person xtofl    schedule 22.09.2008

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

person Mike Ellery    schedule 22.09.2008
comment
Они используют препроцессор и автоматический компоновщик на основе прагмы MSVC для обработки ссылок в Windows, IIRC - person Branan; 22.09.2008