Я заканчивал один из моих ранних проектов C ++, который (в соответствии с фреймворком) должен был быть кроссплатформенным. Я полностью разработал проект в Windows и Visual Studio, полагая, что, поскольку все библиотеки являются кроссплатформенными, выполнение сборки OSX в дальнейшем будет тривиальным. Оказалось, что это не так, скорее «код Windows» не работает должным образом, и в нем были исправлены некоторые ошибки компиляции.
Какие методы существуют, чтобы заранее гарантировать, что код совместим со всеми платформами? Разрабатываете все платформы одновременно, и, таким образом, одновременно тестируете код для каждой платформы, когда добавляются новые функции, вместо того, чтобы разрабатывать разные версии платформ один за другим? (*)
Обращаю особое внимание на то, что советую не зависеть от инструментов, а, скорее, от «процессов разработки», которые способствуют межплатформенной совместимости, независимо от того, какие инструменты используются. Как и тот (*) выше.
В частности, я разрабатываю плагин VST с WDL-OL ( https://github.com/olilarkin/wdl-ol ) и некоторыми кроссплатформенными библиотеками DSP. В проектах WDL-OL настроены проекты как VS, так и Xcode, но я думаю, что проблемы связаны с библиотеками, а затем с различиями в компиляторах.
источник
Ответы:
Создание переносимого кода может быть очень сложным.
Сначала несколько очевидных советов, связанных с языком:
Затем пара дизайнерских рекомендаций:
Наконец тонкие моменты:
TCHAR
), но это может быть сложным в сочетании со стандартной библиотекой (например,cout
противwcout
использования в зависимости от использованияchar
илиwchar_t
)Но это только советы. В этой области вы не можете получить уверенность.
источник
-Wall -Wextra -Werror
-pedantic
.Нет ничего, что могло бы гарантировать совместимость кода с платформой, кроме сборки, запуска и тестирования на нем. Поэтому подход всех здравомыслящих людей состоит в том, чтобы создавать, запускать и тестировать свои приложения на каждой платформе, которую они проектируют, для которой необходимо будет создавать, запускать и тестировать.
Непрерывная интеграция (CI) может значительно облегчить эту нагрузку для небольших проектов, поскольку вы можете получить дешевые или бесплатные агенты сборки для некоторых платформ (в основном Linux), заниматься разработкой под Windows и просто вернуться к Linux в случае возникновения проблемы.
OSX CI довольно сложно, хотя.
источник
Если вы запрашиваете «процессы разработки» и ваша основная платформа разработки - Windows с Visual Studio, я бы посоветовал попробовать построить ваш проект без «windows.h». Вы получите много ошибок компиляции, которые укажут вам во многих местах, где вам нужно реорганизовать свой код. Например, «DWORD» не будет #defined, и вам нужно будет заменить его
uint32_t
везде (обратитесь к Google,stdint.h
и вы найдете полезную информацию о целочисленных типах и их кроссплатформенных определениях). Далее вам нужно будет заменить все вызовы Win32 API, такие как,Sleep()
с их кросс-платформенным эквивалентом (опять же, Google - ваш лучший друг, который покажет соответствующие вопросы и ответы на стеках * .com сайтов). Вероятно, вам не удастся найти все соответствующие кроссплатформенные замены для вашего кода, и вам придется вернуть своюinclude "windows."
директиву, но указать ее#ifdef _WIN32
- подробности здесьПродолжайте задавать более конкретные вопросы и получать ответы - это общее предложение о том, «каким должен быть процесс разработки»
РЕДАКТИРОВАТЬ 1 Другим моим предложением является использование gcc и / или clang на вашей машине для разработки Windows (вместе с Visual Studio)
источник
Это зависит от "некоторых ошибок компиляции", которые вы упоминаете. Не зная, кем они были, невозможно быть конкретным.
У меня есть кроссплатформенный код для Windows / Linux / iOS / Android / Mac. Каждая новая платформа приносила дополнительные ошибки и предупреждения при первом добавлении. Вы быстро узнаете, какие конструкции приносят проблемы. Либо избегайте их, либо абстрагируйте различия в заголовок с помощью
#ifdef
s. Старайтесь никогда не переходить#ifdef
между платформами внутри вашего кода.Один пример:
создает временный экземпляр,
MyClass
который удаляется послеmyfunction
возвращения. В некоторых моих компиляторах C ++ этот экземпляр предназначен для чтения / записи (и тот факт, что он является временным и скоро будет уничтожен, не беспокоит компилятор). С другими,myfunction
должен быть переопределен, чтобы взятьconst MyClass &
, или компилятор жалуется. Неважно, что говорится в стандарте C ++, или какой компилятор верен, а какой нет. После пары раз обнаруженных ошибок я знаю (а) либо объявить временную переменную типаMyClass
и передать ееmyfunction
или (б) объявить ссылкуconst
вmyfunction
и использованияmutable
здесь и там deconstify.Итог: накапливайте опыт и разрабатывайте собственные стандарты кодирования.
источник
Возможный способ помочь переносимости может заключаться в том, чтобы полагаться только на объявления и функции, предоставляемые стандартом C ++ 11 , и с помощью кроссплатформенных библиотек и сред, таких как POCO & Qt .
Но даже это не безотказно. Помни афоризм
С практикой, дисциплиной и большим опытом, перенос программы на другую платформу обычно может быть сделан быстро. Но опыт и ноу-хау имеют большое значение.
источник