Emscripten SDL Компиляция фальюра - PullRequest
0 голосов
/ 04 мая 2018

Я новичок в emscripten; Несколько дней назад я скачал его, просто чтобы попытаться сделать порт игры для JS.

В любом случае, после некоторых шагов у меня возникла эта проблема (в Ubuntu 16.04 STL). Следуя шагам сборки здесь , во-первых, я установил переменные окружения с source ./emsdk_env.sh, а затем я попытался настроить проект с emconfigure ./configure в каталоге проекта. При проверке средств, необходимых для emscripten, у меня появляется эта ошибка:

checking for SDL... no
configure: error: Package requirements (sdl2 >= 2.0.1) were not met:

No package 'sdl2' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SDL_CFLAGS
and SDL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
ERROR:root:Configure step failed with non-zero return code 1! Command line: ['./configure'] at ...

Итак, я попытался установить эту переменную с помощью следующей команды: export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/ Это где на самом деле sdl2.pc находится на моей машине, но это не помогло.

Итак, я установил следующие переменные, которые нужны emconfigure:

export SDL_PATH=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDL_LIBS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDL_CFLAGS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDLNET_LIBS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDLNET_CFLAGS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDLMIXER_LIBS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h
export SDLMIXER_CFLAGS=/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h

и перезапущен emconfigure ./configure, который завершился хорошо. Итак, следующий шаг - emmake make, который дает мне следующую ошибку:

make  all-recursive
make[1]: Entering directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0'
Making all in textscreen
make[2]: Entering directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen'
Making all in fonts
make[3]: Entering directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen/fonts'
make[3]: Nothing to be done for 'all'.
make[3]: Leaving directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen/fonts'
Making all in .
make[3]: Entering directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen'
  CC       txt_conditional.o
Traceback (most recent call last):
  File "/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/emcc", line 11, in <module>
    python_selector.run(__file__)
  File "/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/tools/python_selector.py", line 38, in run
    sys.exit(run_by_import(filename, main) if on_allowed_version() else run_by_subprocess(filename))
  File "/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/tools/python_selector.py", line 13, in run_by_import
    return getattr(importlib.import_module(os.path.basename(filename)), main)()
  File "/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/emcc.py", line 1345, in run
    assert header.endswith(HEADER_ENDINGS), 'if you have one header input, we assume you want to precompile headers, and cannot have source files or other inputs as well: ' + str(headers) + ' : ' + header
AssertionError: if you have one header input, we assume you want to precompile headers, and cannot have source files or other inputs as well: ['/home/ustym/Documents/Projects/emsdk/emscripten/1.37.38/system/include/SDL/SDL.h', 'txt_conditional.c'] : txt_conditional.c
Makefile:447: recipe for target 'txt_conditional.o' failed
make[3]: *** [txt_conditional.o] Error 1
make[3]: Leaving directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen'
Makefile:467: recipe for target 'all-recursive' failed
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0/textscreen'
Makefile:585: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/ustym/Documents/Projects/chocolate-doom-3.0.0'
Makefile:438: recipe for target 'all' failed
make: *** [all] Error 2

это означает, я полагаю, что SDL_PATH, SDL_LIBS, SDL_CFLAGS ... переменные были установлены неправильно. Или, может быть, мне просто нужно предварительно скомпилировать эти заголовки в каталоге SDL.

И последнее: если я пропущу установку переменных SDL и шаг настройки и просто запусту emmake make, компиляция пройдет хорошо, но тогда команда emcc даст мне WARNING:root: .o is not valid LLVM bitcode для всех сгенерированных .o файлов. И это действительно имеет смысл.

Так что я застрял здесь. Кто-нибудь может сказать мне, как правильно установить PKG_CONFIG_PATH для emscripten или мне действительно нужно предварительно скомпилировать эти заголовки в каталоге SDL? Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018

Прежде всего, установка PKG_CONFIG_PATH, включение или, что еще хуже, каталогов библиотек (-I и -L) для размещения библиотек выглядит для меня ужасной идеей: объектные файлы Emscripten содержат битовый код LLVM (а не машинный код хоста), его .so файлы AFAIK также содержат битовый код. Именно этот битовый код преобразуется в JS, а не в машинный код хоста. Поэтому вам нужно самостоятельно построить зависимости вашей программы с помощью Emscripten (и, скорее всего, не следует устанавливать их на хост-систему). К счастью, есть несколько официальных портов Emscripten (подробности см. здесь ).

Emscripten имеет собственную реализацию SDL v1 (которую вы, вероятно, пытались использовать вручную), но ваша программа, похоже, требует SDL2. Хорошая новость: вам, вероятно, просто нужно передать -s USE_SDL=2 в CFLAGS и LDFLAGS при configure ing (информацию о порте SDL2 см. Ниже по ссылке выше). Плохая новость: что-то может быть перенесено не полностью. Но я успешно использовал это до некоторой степени.

Когда у вас configure d на хосте и вы делаете с emmake, вы, вероятно, указали пути компилятора среди других параметров, скорректированных с помощью emconfigure и emmake, уже встроенных в сгенерированный Makefile с помощью ./configure, не контролируемых emconfigure , так что host gcc / clang только что сгенерировал машинный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...