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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
400
8

Ответы 8

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

./configure
make
make install

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

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

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

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

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

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

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

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

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

Они используют препроцессор и автоматический компоновщик на основе прагм MSVC для обработки компоновки в Windows, IIRC.

Branan 22.09.2008 23:02

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

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

На самом деле ваш вопрос состоит из двух вопросов в одном:

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

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

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

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

Другие вопросы по теме