Работа над кросс-платформенной библиотекой

Каковы лучшие практики при записи кросс-платформенной библиотеки в C++?

Моей средой разработки является Eclipse CDT на Linux, но моя библиотека должна иметь возможность скомпилировать исходно в Windows любого (от Visual C++, например).

Спасибо.

6
задан Alon Gubkin 3 June 2010 в 16:21
поделиться

7 ответов

В некоторой степени это зависит от того, для чего именно предназначена ваша библиотека.

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

Если ваша библиотека зависит в основном от файлового ввода-вывода, вам лучше использовать существующую хорошо проверенную кроссплатформенную библиотеку абстракции файловой системы, такую как Boost Filesystem.

Если ваша библиотека не является ни одной из вышеперечисленных (т.е. не существует хорошо проверенных кроссплатформенных фреймворков, которые вы могли бы использовать), лучше всего убедиться, что вы придерживаетесь стандартного C++ насколько это возможно (это означает, что не #include или , например). Когда это невозможно (например, ваша библиотека считывает необработанные звуковые данные с микрофона), вы захотите убедиться, что детали реализации для данной платформы достаточно абстрагированы, чтобы минимизировать работу по переносу вашей библиотеки на другую платформу.

5
ответ дан 17 December 2019 в 18:10
поделиться

Каждый раз, когда я работаю над чем-то вроде этого, я пытаюсь создать это в различных средах, которые мне нужны. Точно так же, если вы создавали веб-страницу и хотели убедиться, что она работает в IE, Firefox и Chrome, вы бы протестировали ее во всех трех браузерах. Протестируйте его в различных средах, которые вы хотите поддерживать, и вы узнаете, для каких систем, по вашему мнению, он работает.

0
ответ дан 17 December 2019 в 18:10
поделиться

вопрос, как указано, является немного абстрактным. Но вы можете рассмотреть QT

0
ответ дан 17 December 2019 в 18:10
поделиться

Пара предложений из моего практического опыта:

1) Убедитесь в регулярной компиляции исходников на ваших целевых платформах. Не ждите до конца. Это поможет выявить ошибки на ранней стадии. Используйте систему непрерывной сборки - это значительно облегчает жизнь.

2) Никогда не используйте заголовки, специфичные для конкретной платформы. Даже для написания родного кода - ведь вы знаете, что в заголовке windows может ожидаться какая-то строка, которая была ABC в XP, но была заменена на ABC.12 в Win7.

3) Используйте идеи из STL и BOOST, а затем стройте на их основе. Однако никогда не считайте их панацеей от проблем - STL легко поставляется с вашим кодом, а BOOST - нет.

4) Не используйте специфические для компилятора конструкции, такие как __STDCALL. Это просто ад.

5) Один и тот же код при компиляции с одинаковыми опциями компилятора в g++ и cl может привести к различному поведению. Пожалуйста, держите под рукой копию руководства по компилятору.

1
ответ дан 17 December 2019 в 18:10
поделиться

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

Существует много альтернатив для кроссплатформенных библиотек, но мои личные предпочтения:

  • GUI: Qt
  • АБСТРАКЦИЯ ОС (хотя Qt отлично справляется со всем этим само по себе): Boost
  • Кроссплатформенные Makefiles: CMake

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

-2
ответ дан 17 December 2019 в 18:10
поделиться

Насколько мне известно, вы можете сделать несколько вещей:

  1. Вы можете разделить код конкретной платформы на разные пространства имен.

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

  3. Вы можете использовать макросы, зная, какой код компилировать (в этом случае код будет зависеть от платформы). Посетите эту ссылку для получения дополнительной информации.

  4. Протестируйте свою библиотеку в нескольких средах.

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

2
ответ дан 17 December 2019 в 18:10
поделиться

Вы имеете в виду помимо непрерывной интеграции и тестирования на целевых платформах? Или помимо использования дизайна, чтобы абстрагироваться от деталей реализации?

Нет, ничего не могу придумать.

-3
ответ дан 17 December 2019 в 18:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: