Компиляция LuaJIT как C++?

Не могу скомпилировать LuaJIT с g++ или clang++. Вот некоторые DEBUG. Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

$ make CC="g++"
==== Building LuaJIT 2.0.4 ====
make -C src
make[1]: Entering directory `/home/nutanix/thirdparty/LuaJIT-2.0.4/src'
HOSTCC    host/minilua.o
host/minilua.c:370: error: uninitialized const ‘luaO_nilobject_’
host/minilua.c:604: error: redefinition of ‘const TValue luaO_nilobject_’
host/minilua.c:370: error: ‘const TValue luaO_nilobject_’ previously declared here
host/minilua.c:946: error: uninitialized const ‘luaP_opmodes’
host/minilua.c: In function ‘void luaG_typeerror(lua_State*, const TValue*, const char*)’:
host/minilua.c:2542: error: invalid conversion from ‘long int’ to ‘const char*’
host/minilua.c: At global scope:
host/minilua.c:2620: error: redefinition of ‘const lu_byte luaP_opmodes [38]’
host/minilua.c:946: error: ‘const lu_byte luaP_opmodes [38]’ previously declared here
make[1]: *** [host/minilua.o] Error 1
make[1]: Leaving directory `/home/nutanix/thirdparty/LuaJIT-2.0.4/src'
make: *** [default] Error 2

$ make CC="clang++"
==== Building LuaJIT 2.0.4 ====
make -C src
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
make[1]: Entering directory `/home/nutanix/thirdparty/LuaJIT-2.0.4/src'
HOSTCC    host/minilua.o
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
host/minilua.c:370:21: error: default initialization of an object of const type
      'const TValue' (aka 'const lua_TValue') without a user-provided default
      constructor
static const TValue luaO_nilobject_;
                    ^
host/minilua.c:370:36: note: add an explicit initializer to initialize 'luaO_nilobject_'
static const TValue luaO_nilobject_;
                                   ^
                                    = {}
host/minilua.c:604:21: error: redefinition of 'luaO_nilobject_'
static const TValue luaO_nilobject_={{NULL},0};
                    ^
host/minilua.c:370:21: note: previous definition is here
static const TValue luaO_nilobject_;
                    ^
host/minilua.c:946:22: error: default initialization of an object of const type
      'const lu_byte [38]'
static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];
                     ^
host/minilua.c:946:59: note: add an explicit initializer to initialize 'luaP_opmodes'
static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];
                                                          ^
host/minilua.c:2491:13: error: assigning to 'const char *' from incompatible type 'long'
ar->namewhat=(ci)?NULL:NULL;
            ^~~~~~~~~~~~~~~
host/minilua.c:2540:12: error: cannot initialize a variable of type 'const char *' with
      an rvalue of type 'long'
const char*kind=(isinstack(L->ci,o))?
           ^    ~~~~~~~~~~~~~~~~~~~~~
host/minilua.c:2620:22: error: redefinition of 'luaP_opmodes'
static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={
                     ^
host/minilua.c:946:22: note: previous definition is here
static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];
                     ^
6 errors generated.
make[1]: *** [host/minilua.o] Error 1
make[1]: Leaving directory `/home/nutanix/thirdparty/LuaJIT-2.0.4/src'
make: *** [default] Error 2

$ clang++ -v
clang version 3.6.1 (tags/RELEASE_361/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
Found candidate GCC installation: /opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2
Selected GCC installation: /opt/rh/devtoolset-3/root/usr/lib/gcc/x86_64-redhat-linux/4.9.2
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64

$ g++ -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)

$ uname -a
Linux guo-dev 2.6.32-431.17.1.el6.x86_64 #1 SMP Wed May 7 23:32:49 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

В общем, у меня система CentOS 6.5 с g++ 4.4.7 и clang++ 3.6.1. Попытка скомпилировать LuaJIT с помощью компилятора C++, чтобы LuaJIT мог безопасно генерировать исключения C++.

Любая помощь будет принята с благодарностью. Спасибо!


person Friendly Genius    schedule 13.07.2015    source источник
comment
LuaJIT выдает код C. С это не С++. C нельзя использовать/обрабатывать/компилировать как C++. Код C нельзя скомпилировать с помощью компилятора C++ по той же причине, по которой вы не можете запустить JavaScript в интерпретаторе Python. Используйте компилятор C для компиляции кода C, и ваша жизнь станет проще.   -  person The Paramagnetic Croissant    schedule 13.07.2015
comment
@EtanReisner Я упомянул причину в вопросе - чтобы LuaJIT мог безопасно генерировать исключения C ++.   -  person Friendly Genius    schedule 13.07.2015
comment
@ThePara MagneticCroissant Я не понимаю вашего комментария о том, что я не могу использовать компилятор C++. Из многих страниц, которые я прочитал в гугле, обычной практикой является компиляция LuaJIT с помощью компилятора C++, чтобы вместо longjmp выбрасывались исключения.   -  person Friendly Genius    schedule 13.07.2015
comment
Разве этот раздел страницы luajit не указывает, что это (в основном) просто уже работает?   -  person Etan Reisner    schedule 13.07.2015
comment
@EtanReisner, по-видимому, только в том случае, если вы компилируете LuaJIT с помощью компилятора C++. marcusirven.com/blog/2009/ 19.02.   -  person Friendly Genius    schedule 13.07.2015
comment
Речь идет о lua, а не о luajit. Эта страница кажется (мне, не являющемуся пользователем C++), чтобы сказать, что luajit обрабатывает эти случаи по умолчанию.   -  person Etan Reisner    schedule 13.07.2015
comment
почему сборка с помощью компилятора C генерирует код, который генерирует исключения? Актуально, хотя речь идет о Lua вместо LuaJIT: stackoverflow.com/questions/8400016/   -  person Friendly Genius    schedule 13.07.2015


Ответы (1)


Компиляция LuaJIT с помощью компилятора C++ не решит проблему «безопасного создания исключений C++», поскольку части LuaJIT написаны на языке ассемблера и поскольку во время выполнения машинный код будет генерироваться и выполняться динамически, если активен JIT-компилятор LuaJIT. . Поэтому крайне важно, чтобы машинный код мог обрабатывать исключения C++.

См. также раздел Совместимость исключений C++ на веб-сайте LuaJIT http://luajit.org/extensions.html#exceptions. Существует таблица, в которой объясняется, при каких условиях безопасно генерировать исключения C++.

Однако в вопросах упоминается файл LuaJIT-2.0.4/src/host/minilua.c. Как написано в заголовке комментария этого файла:

/* This is a heavily customized and minimized copy of Lua 5.1.5. */
/* It's only used to build LuaJIT. It does NOT have all standard functions! */

Так что теоретически должно быть возможно скомпилировать этот урезанный простой C lua с помощью компилятора C++. Но это не повлияет на среду выполнения LuaJIT.

Если вы хотите скомпилировать обычный Lua (а не LuaJIT) с помощью компилятора C++, я бы рекомендовал взять оригинальный исходный код Lua из http://www.lua.org/ftp/, поскольку исходный код minilua.c в LuaJIT урезан таким образом, что его невозможно скомпилировать с помощью компилятора C++ без изменений, тогда как исходный Исходный код Lua может быть скомпилирован с помощью компилятора C++ без больших проблем.

person Oliver    schedule 15.10.2015