Как я могу условно скомпилировать код для emscripten?
Работая с кодовой базой, которая поддерживает сборку для нескольких операционных систем, разумно, когда требуются модификации для Emscripten, интегрировать их в одну и ту же кодовую базу с помощью условной компиляции, чтобы она продолжала работать в других средах.
Похоже, что нет никакой документации по этой теме, которая мне кажется очень плохой, и я не могу найти никаких вопросов по этому поводу, что мне кажется очень удивительным - я ожидал, что это будет протоптанная и документально оформленная территория,
Как я могу это сделать?
(Я смотрел на tools/shared.py
кажется, это говорит о том, что #ifdef EMSCRIPTEN
или же #ifdef __EMSCRIPTEN__
может быть использован; Я все еще задаю этот вопрос, чтобы определить, прав ли я, является ли это верным способом сделать это, возможно, даже который следует использовать.)
3 ответа
Согласно Обнаружению Emscripten в препроцессоре, правильное определение для использования __EMSCRIPTEN__
,
В октябре 2016 года был введен строгий режим сборки, который при включении удаляет EMSCRIPTEN
определить. Поэтому не рекомендуется использовать EMSCRIPTEN
хотя он все еще работает в нестрогом режиме сборки.
#ifdef EMSCRIPTEN
является предпочтительным способом AFAIK.
Прежде чем загромождать ваш исходный код #ifdef
s, подумайте, не имеет ли больше смысла иметь определенные зависимые от платформы файлы и позволить инструменту сборки сделать всю работу.
Кроме того, emscripten уже определяет LINUX
потому что он очень похож на систему Linux. Обычно такое поведение уже устраняет большую часть необходимости обработки платформы.
Это мое текущее решение:
У меня есть linux Makefile с обычной целью, он связывает ранее созданную статическую библиотеку и выводит исполняемый файл.
Код действует на WEB-определение с помощью ifdefs.
Makefile для библиотеки действует на переменную окружения TARGET для конкретных источников платформы:
ifeq ($ (TARGET), WEB) MODULES = RenderingEngine2.o RenderingEngine1.o WebApp.o main.o else MODULES = RenderingEngine2.o RenderingEngine1.o LinuxApp.o main.o endif
- Вдобавок к Makefile есть скрипт bash emscripten.sh со следующим содержимым:
#! / Bin/ Баш make TARGET="WEB" CXX="em++ -DWEB" AR="emar" модули make TARGET="WEB" CXX="em++ -DWEB" AR="emar" emcc --preload-file assets -o bin/helloArrow.html bin/helloArrow bin/lib.o Firefox bin/helloArrow.html
- Скомпилируйте и выполните с./emscripten.sh
ПРИМЕЧАНИЕ: emscripten, похоже, не нравится расширение.a в статических библиотеках, поэтому назовите свою библиотеку с расширением.o.