Napotkałem dziwny błąd, gdy próbowałem użyć biblioteki libclang w aplikacji Qt.Nie można użyć libclang z 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
powłoki poleceń i wyjściowa:
$ 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
przypadku ręcznie prowadzony g ++ bez użycia QMake, że pojawia się ten sam błąd:
- Jeśli komentarz linię
w.show();
program kompiluje się i działa nawet jeśli wejdzie ona główną pętlę bez oknie pokazanym na rysunku. - Jeśli skomentuję linie
CXIndex index = clang_createIndex(0, 0);
iQ_UNUSED(index)
, program skompiluje i uruchomi. Wchodzi do głównej pętli z widocznym oknem. - Również skompilowałem to z clang i otrzymuję ten sam komunikat o błędzie.
- Przeszukałem Internet i znalazłem tylko ten wynik z podobnym komunikatem o błędzie, ale nie wiem, czy i jak może mi pomóc: http://comments.gmane.org/gmane.comp.compilers.llvm.devel/34647.
Używam Qt 5.1 i ArchLinux mam pakiet clang
(wersja 3.3) zainstalowane który zawiera nagłówki libclang i pliki /usr/lib/libclang.so i /usr/lib/libclang.a.
Jaki jest powód, dla którego ten program nie działa i jak mogę go naprawić?
Aktualizacja: Znalazłem this page. Działa LIBGL_ALWAYS_INDIRECT=1 ./test
działa dobrze, ale chcę więcej niż to. Nie powinienem ustawiać tej zmiennej środowiskowej, aby móc uruchomić mój program.
Spróbuj wstawić -lclang po -lGL. Czasami dziwne problemy z linkerem wynikają z posiadania rzeczy w niewłaściwej kolejności. Mesa używa LLVM dla shaderów, więc może być źródłem twojego problemu. – Spudd86
To może być pomocne http://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86
@ Spudd86 Próbowałem 'g ++ -fPIE test.cpp -o test -I/usr/include/qt -I/usr/include/qt/QtWidgets -lGL -lQt5Widgets -lclang' i otrzymuję ten sam błąd środowiska wykonawczego. – silviubogan