Компилиране на 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++. 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
@TheParamagneticCroissant Не разбирам коментара ви, че не мога да използвам 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 са написани на асемблер и защото по време на изпълнение машинният код ще се генерира и изпълнява динамично, ако компилаторът Just-In-Time на 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