Каков Ваш любимый способ иметь дело с кросс-платформенной разработкой? [закрытый]

Вы пытались запустить команду python manage.py collectstatic, чтобы фактически скопировать все статические файлы в общую статическую папку?

10
задан 3 revs, 2 users 100% 26 February 2009 в 13:33
поделиться

10 ответов

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

8
ответ дан 3 December 2019 в 15:22
поделиться

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

Объект, который загружает данные, смотрит на это значение, и если это соответствует своему внутреннему представлению значения, затем файл содержит собственные значения порядка байтов. Загрузка проста оттуда.

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

6
ответ дан 3 December 2019 в 15:22
поделиться

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

4
ответ дан 3 December 2019 в 15:22
поделиться

Я обычно пользуюсь многоплатформенными библиотеками, как повышение или QT, они решают о 95% моих проблем, имеющих дело с платформой определенные коды (я признаю, что единственной платформой i-m контакт с является winxp и Linux). Для остающихся 5% я обычно инкапсулирую платформу определенный код в одном или нескольких классах, с помощью шаблона "фабрика" или универсального программирования для сокращения разделов #ifdef/#endif

3
ответ дан 3 December 2019 в 15:22
поделиться

Обычно, этот вид проблемы мобильности оставлены системе сборки (автоинструменты или cmake в моем случае), которые обнаруживают конкретный из системы. Наконец, я получаю config.h от этой системы сборки, и затем я просто должен использовать постоянный определенный в этом заголовке (использующий, ЕСЛИ ОПРЕДЕЛЕНО).

Например, вот config.h:

/* Define to 1 if you have the <math.h> header file. */
#define HAVE_MATH_H

/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H

/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H

/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H

Затем код будет похож на это (для time.h, например):

#ifdef (HAVE_TIME_H)
//you can use some function from time.h
#else
//find another solution :)
#endif
2
ответ дан 3 December 2019 в 15:22
поделиться

Я думаю, что другие ответы сделали отличную работу по обращению ко всем Вашим проблемам за исключением порядка байтов, таким образом, я добавлю что-то, о котором... это должна только быть проблема в Ваших интерфейсах к внешнему миру. Вся Ваша внутренняя обработка данных должна быть сделана в собственном порядке байтов. При передаче через TCP/IP (или любой другой сокетный протокол), существуют функции, которые необходимо всегда использовать для преобразования значений в и от сетевого порядка байтов. IIRC, функции htons() и htonl(), (разместите для сетей короткий, хост для сетей долго), и их инверсии, как которые я не могу помнить..., возможно, что-то ntohl(), и т.д.?

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

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

3
ответ дан 3 December 2019 в 15:22
поделиться

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

1
ответ дан 3 December 2019 в 15:22
поделиться

Это зависит от вида вещей, которые Вы делаете. Одна вещь, которая является почти всегда правильным выбором, состоит в том, чтобы портировать основной материал на любую целевую платформу и затем иметь дело с ним с общим API.

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

Но это только действительно работает на низкоуровневый материал. Для GUI IO высокого уровня, пользуясь уже существующей библиотекой является определенно более оптимальным вариантом почти каждый раз.

1
ответ дан 3 December 2019 в 15:22
поделиться

Для платформ без собственной поддержки с плавающей точкой мы использовали некоторый собственный тип фиксированной точки и некоторые определения типов. Как это:

// native floating points
typedef float Real;

или для фиксированных точек что-то как:

typedef FixedPoint_16_16 Real;

Затем математические функции могут посмотреть это:

Real OurMath::ourSin(const Real& value);

Фактическая реализация могла бы, конечно, быть:

float OurMath::ourSin(const float& value)
{
  return sin(value);
}
// for fixed points something more or less trickery stuff
1
ответ дан 3 December 2019 в 15:22
поделиться

Для вещей как порядок байтов с помощью различных функций или классов немного nore наверху. попытайтесь использовать препроцессор как:

#ifdef INTEL_LINUX:
   code here
#endif

#ifdef SOLARIS_POWERPC
   code here
#endif
0
ответ дан 3 December 2019 в 15:22
поделиться