Emscripten Clang создает двоичные кросс-компиляторы цели ELF для 64-битного исполняемого файла и wasm - PullRequest
1 голос
/ 04 февраля 2020

У меня есть подготовленный минимальный проект Cmake, содержащий один файл cpp, который представляет основной файл, и один файл cpp, который представляет общую библиотеку, которая печатает в основном привет мир. https://github.com/courteous/wasmELF.git

Цель состоит в том, чтобы скомпилировать этот мини-код только с emscripten / clang и создать

1) один двоичный модуль WebAssembly (wasm) версии 0x1 (MVP)

2) один ELF 64-битный LSB

без очистки каталога сборки cmake и повторной его сборки.

В настоящее время я могу успешно произвести их, купив, выполнив команды

emconfigure cmake ../ -DCMAKE_BUILD_TYPE=WASM
make

и

cmake ../ -DCMAKE_BUILD_TYPE=Linux
make 

Однако проблема заключается в том, что для этого мне нужно скомпилировать первый с Clang, чтобы удалить сборку, а затем сделать вторую компиляцию с G CC. Я бы хотел, чтобы Emscripten / Clang производил их вместо купленных. Я не хочу удалять каталог сборки, так как время компиляции занимает слишком много времени. (Ну, не в этом проекте, но представьте, что проект был намного больше)

Я вижу, что emscripten / clang всегда выбирает цель "wasm32-unknown-emscripten"

clang++ -target wasm32-unknown-emscripten 

и если я правильно понимаю, что цель должна измениться

Я вижу, что проект создает битовый код LLVM IR, так как я отправил флаг "flto"

т.е.

file TestSharedClass.cpp.o
TestSharedClass.cpp.o: LLVM IR bitcode

и в CMakeLists.txt

set(CMAKE_CXX_FLAGS "-flto")

x86_64-unknown- linux -gnu является поддерживаемой целью emscripten / Clang

~/Projects/emscripten/emsdk/upstream/bin$ ./llc --version
LLVM (http://llvm.org/):
  LLVM version 11.0.0git
  Optimized build with assertions.
  Default target: x86_64-unknown-linux-gnu
  Host CPU: haswell

  Registered Targets:
    wasm32 - WebAssembly 32-bit
    wasm64 - WebAssembly 64-bit
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

В cmake у меня есть

SET(TARGET x86_64-unknown-linux-gnu)

однако когда я запускаю

emconfigure cmake ../ -DCMAKE_BUILD_TYPE=Linux
make

, я получаю mainTestFile. js и mainTestFile.wasm вместо 64-битного кода ELF.

что я делаю здесь неправильно. Как сообщить clang продукту один раз ELF и один раз из одного и того же кода, без необходимости очищать каталог сборки. Это должно быть возможно, поскольку clang создает битовый код LLVM IR. Или я так понимаю?

https://github.com/emscripten-core/emscripten/issues/10361

1 Ответ

0 голосов
/ 05 февраля 2020

ОК, что, по-видимому, невозможно, т. Е. В ответе разработчика на github говорится, что em cc или emmake нельзя использовать с другой целью, отличной от wasm32-unknown-emscripten.

...