Ho incontrato uno strano bug quando ho provato a usare libclang in un'applicazione Qt.Impossibile usare libclang con Qt
test.cpp
#include <QApplication>
#include <QMainWindow>
#include <clang-c/Index.h>
int main (int argc, char *argv[]) {
QApplication a(argc, argv);
QMainWindow w;
w.show();
CXIndex index = clang_createIndex(0, 0);
Q_UNUSED(index)
return a.exec();
}
test.pro
QT += core widgets
TARGET = test
TEMPLATE = app
SOURCES += test.cpp
LIBS += -lclang
comandi Shell e uscita:
$ ls
test.cpp test.pro
$ qmake
$ make
g++ -c -pipe -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/qt/mkspecs/linux-g++ -I. -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -o test.o test.cpp
g++ -Wl,-O1,--sort-common,--as-needed,-z,relro -Wl,-O1 -o test test.o -lclang -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
$ ./test
Two passes with the same argument (-alloca-hoisting) attempted to be registered!
Segmentation fault
Se corro manualmente g ++ senza utilizzare qmake, I ottenere lo stesso errore:
- Se io commento la linea
w.show();
il programma viene compilato ed eseguito anche se si entra nel ciclo principale, senza la finestra mostrata. - Se commento le righe
CXIndex index = clang_createIndex(0, 0);
eQ_UNUSED(index)
, il programma viene compilato ed eseguito. Entra nel ciclo principale con la finestra visibile. - Ho anche compilato questo con clang e ottengo lo stesso messaggio di errore.
- Ho cercato sul Web e ho trovato solo questo risultato con un messaggio di errore simile ma non so se e come può aiutarmi: http://comments.gmane.org/gmane.comp.compilers.llvm.devel/34647.
Sto usando Qt 5.1 e ArchLinux, ho il pacchetto clang
(versione 3.3) installato che comprende le intestazioni libclang ei file /usr/lib/libclang.so e /usr/lib/libclang.a.
Qual è il motivo per cui questo programma non funziona e come posso risolverlo?
Update: ho trovato this page. In esecuzione LIBGL_ALWAYS_INDIRECT=1 ./test
funziona bene, ma voglio più di questo. Non avrei dovuto impostare quella variabile d'ambiente per poter eseguire il mio programma.
Prova a inserire -lclang dopo -lGL. A volte problemi di linker strani sono dovuti ad avere le cose nell'ordine sbagliato. Mesa usa LLVM per gli shader in modo che questa possa essere la fonte del tuo problema – Spudd86
Questo potrebbe essere utile http://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86
@ Spudd86 Ho provato 'g ++ -fPIE test.cpp -o test -I/usr/include/qt -I/usr/include/qt/QtWidgets -lGL -lQt5Widgets -lclang' e ottengo lo stesso errore di runtime. – silviubogan