1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zlgopen-awtk

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
cross_platform_programming.md 5.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 22:52 91e8897

Написание кроссплатформенного кода

1. По возможности используйте функции в tkc

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

2. Программирование с ориентацией на интерфейс

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

3. Указание библиотек, заголовочных файлов, параметров препроцессора и параметров компоновки для конкретной платформы

Helper предоставляет набор функций для обработки параметров для разных платформ. Возможные значения для имени платформы:

  • «Windows» — платформа Windows;
  • «Linux» — платформа Linux;
  • «Darwin» — платформа MacOS.

Android и IOS не используют scons для компиляции, поэтому этот метод не применяется.

  • Добавление библиотек для конкретной платформы:

Пример:

helper.add_platform_libs("Windows", ["ws2_32"])
helper.add_platform_libs("Linux", ["pthread", "dl", "readline", "m"])
helper.add_platform_libs("Darwin", ["pthread", "dl", "readline", "m"])
  • Добавление путей поиска библиотек для конкретной платформы:
 add_platform_libpath(self, platform_name, APP_LIBPATH)

Пример:

helper.add_platform_libpath("Linux", ["/usr/local/lib"])

Здесь APP_LIBPATH является массивом.

  • Добавление путей поиска заголовочных файлов для конкретной платформы:
  add_platform_cpppath(self, platform_name, APP_CPPPATH)

Пример:

helper.add_platform_libpath("Linux", ["/usr/local/include"])

Здесь APP_CPPPATH является массивом.

  • Добавление параметров препроцессора для конкретной платформы:
 add_platform_ccflags(self, platform_name, APP_CCFLAGS)

Пример:

helper.add_platform_ccflags("Linux", " -DSOME_MACRO=1 ")

ccflags имеет строковый формат, а не массив.

  • Добавление параметров препроцессора C++ для конкретной платформы:
 add_platform_cxxflags(self, platform_name, APP_CXXFLAGS)

Пример:

helper.add_platform_cxxflags("Linux", " -DSOME_MACRO=1 ")

cxxflags имеет строковый формат, а не массив.

  • Добавление параметров компоновщика для конкретной платформы:
 add_platform_linkflags(self, platform_name, APP_LINKFLAGS)

linkflags имеет строковый формат, а не массив.

4. Различение макросов для разных платформ

  • WIN32 или WINDOWS — платформа Windows.
  • MINGW — MinGW-компиляция для Windows.
  • LINUX — платформа Linux.
  • MACOS или APPLE — платформа Macos.
  • ANDROID — платформа Android.
  • IOS — платформа iOS.

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

Пример:

#ifdef ANDROID
#include "SDL.h"
#endif /*ANDROID*/

#if defined(__APPLE__) || defined(LINUX)
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <pwd.h>
#elif defined(WIN32)
#include <stdio.h>
#include <windows.h>
#include <io.h>
#include <direct.h>
#include <Shlobj.h>
#include <fileapi.h>
#define unlink _unlink
#define rename MoveFileA
#define ftruncate _chsize
#include "./dirent.inc"
#include "tkc/utf8.h"
#include "tkc/mem.h"
#endif

#if defined(__APPLE__)
#include <mach-o/dyld.h>
#endif /*__APPLE__*/

5. Добавление файлов для конкретных платформ

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

Пример:

import platform;

OS_NAME=platform.system()
if OS_NAME == 'Windows':
  sources=Glob('src/windows/*.c')
elif OS_NAME == 'Linux':
  sources=Glob('src/linux/*.c')

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/zlgopen-awtk.git
git@api.gitlife.ru:oschina-mirror/zlgopen-awtk.git
oschina-mirror
zlgopen-awtk
zlgopen-awtk
master