Перейти к содержанию
Fire Monkey от А до Я
  • 0

Разделение платформозависимого кода по файлам


Blind_Cat

Вопрос

День добрый.

Суть задачи: Есть мультиплатформенный код(Пока Android/Win64/Win32), как вынести код относящийся к разным платформам в отдельные файлы?
При этом чтобы в проект для андроида были добавлены файлы допустим android/xxx.cpp,  а для windows win/xxx.cpp. Насколько я увидел IDE не поддерживает условное добавление файлов в проект.
Как кто выкручивается в этих случаях?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Это в одном файле. В CPP можно конечно подключить, через что-то подобное

=== reailze.cpp ===
#if defined (_Windows)
#   include "win/reailze.cxx"
#elif defined(__ANDROID__)
#   include "anrdoid/reailze.cxx"
#endif
=== reailze.cpp ===
И туда уже вынести специфику... Но для успешной сборки/линковки оба этих файла должны быть добавлены к проекту.
Соответственно при использовании платформенно зависимых типов внутри СХХ файлов мы получим невозможность сборки проекта.
 

Ссылка на комментарий
  • 0

Можно кактотак обернуть весь код в IFDEF. Тогда можно компилировать под любой платформой.
Но в процессе написания и отладки рекомендую все-таки закомментировать диррективы условной компиляции, а в окончательном варианте раскомментировать. 

unit UnitWindows;
//{$IFDEF MSWINDOWS}
interface
  ...
implementation
  ...
initialization
  ...
finalization
   ...
//{$ELSEIF} 
//implementation
//{$ENDIF}
end.
Ссылка на комментарий
  • 0
7 часов назад, RoschinSpb сказал:


Но в процессе написания и отладки рекомендую все-таки закомментировать диррективы условной компиляции, а в окончательном варианте раскомментировать. 

С директивами дебагер плохо работает?

Ссылка на комментарий
  • 0
8 часов назад, RoschinSpb сказал:

Можно кактотак обернуть весь код в IFDEF. Тогда можно компилировать под любой платформой.
Но в процессе написания и отладки рекомендую все-таки закомментировать диррективы условной компиляции, а в окончательном варианте раскомментировать. 


unit UnitWindows;
//{$IFDEF MSWINDOWS}
interface
  ...
implementation
  ...
initialization
  ...
finalization
   ...
//{$ELSEIF} 
//implementation
//{$ENDIF}
end.

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

Ссылка на комментарий
  • 0
14 часов назад, krapotkin сказал:

unit unit1;

{$IFDEF MSWINDOWS}
{$i unit1.win.pas}
{$ENDIF}
{$IFDEF IOS}
{$i unit1.ios.pas}
{$ENDIF}

end;

 

При этом файлы unit1.win.pas и unit1.ios.pas должны быть добавлены в проект. Соответственно при компиляции для ios, компилятор будет пытаться собрать и unit1.win.pas. Что приведет к ошибкам при использовании типов и функций Win32.

Вероятно решением будет еще внутри unit1.win.pas и unit1.ios.pas обернуть все это добро в ifdef/endif.

Спасибо за обсуждение =)

Ссылка на комментарий
  • 0

вовсе не должны

чего укажете, то и подключится. инаке бы делфи вообще не могла кроссплатформенно работать. посмотрите сколько файлов там с суффиксами Android IOS и т.д.

Ссылка на комментарий
  • 0

Почему не должны? Файл в проект влючен? Включен. Где сказано что его собирать не надо?

Да и вопрос был не о Delphi, а о Builder. Но это как мне кажется несущественно.

PS Имя файла, в частности его суффикс файла только подсказывает нам его содержимое. Файлы вообще могут называться 1.pas 2.pas 3.pas итд.

 

 

Ссылка на комментарий
  • 0

файл в проект не включен

он просто вставляется препроцессором в это место 

обычно все это происходит в uses. А у вас в Uses очень много файлов, совсем не включенных в проект

Ссылка на комментарий
  • 0
  • Модераторы

если смотреть исходники, то там все наглядно показано как правильно делать

uses
{$IFDEF MSWINDOWS}
  FMX.FontGlyphs.Win,
{$ENDIF}
{$IFDEF MACOS}
{$IFNDEF NEXTGEN}
  FMX.FontGlyphs.Mac,
{$ENDIF}
{$ENDIF}
{$IFDEF IOS}
  FMX.FontGlyphs.iOS,
{$ENDIF}
{$IFDEF ANDROID}
  FMX.FontGlyphs.Android,
{$ENDIF}
....;

а в проекте мы подключаем только "главный" модуль FMX.FontGlyphs.pas

Ссылка на комментарий
  • 0

А можно рабочий пример увидеть

19 минут назад, krapotkin сказал:

файл в проект не включен

Ок. Спасибо. Если кому-то понадобится, то образец разделения на Delphi в приложенном файле.

В течение дня попробую сделать тоже самое на Builder.

 

test_multifile.zip

Ссылка на комментарий
  • 0
2 часа назад, Blind_Cat сказал:

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

Нет это получается в юните есть код под одну платформу, а во всех остальных платформах он с точки зрения компилятора пустой.

Ссылка на комментарий
  • 0
3 часа назад, Rusland сказал:

С директивами дебагер плохо работает?

Нет, там перестают работать все навороты редактора (кодкомплит, переходы по клику, хэльпинсайд)

Изменено пользователем RoschinSpb
Ссылка на комментарий
  • 0

В общем с билдером тоже самое. Единственное смущает, что файлы используемые в проекте в сам проект не добавлены.
Для добавления всех файлов в проект необходимо обрамить платформозависимый код #ifdef/endif. 
Рабочий пример в приложении. Тему можно закрывать)

test_multifile_bcb.zip

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...