Qtアプリケーションでlibclangを使用しようとしたときに奇妙なバグが発生しました。Qtでlibclangを使用できません
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
シェルコマンドと出力:
$ 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
私は手動でqmakeのを使用せず++グラム実行すると、I同じエラーが発生する:
- 私はプログラムが示されているウィンドウなしのメインループに入っても、コンパイルし、実行します
w.show();
行をコメントした場合。 - 私が
CXIndex index = clang_createIndex(0, 0);
とQ_UNUSED(index)
行にコメントすると、プログラムがコンパイルされて実行されます。ウィンドウが表示された状態でメインループに入ります。 - これもclangでコンパイルしましたが、同じエラーメッセージが表示されます。
- 私はウェブを検索しましたが、同様のエラーメッセージでこの結果しか見つかりませんでしたが、それが私に役立つかどうか、どのように助けてくれるのか分かりません:http://comments.gmane.org/gmane.comp.compilers.llvm.devel/34647。私はQtの5.1とArchLinuxを使用しています
は、私がlibclangヘッダーおよびファイルは/usr/lib/libclang.soと/usr/lib/libclang.a含まclang
パッケージ(バージョン3.3)がインストールされています。
このプログラムが動作しない理由は何ですか?どのように修正できますか?
アップデート:私はthis pageを見つけました。 LIBGL_ALWAYS_INDIRECT=1 ./test
を実行してもうまく動作しますが、これ以上必要です。自分のプログラムを実行できるように、その環境変数を設定する必要はありません。
-lGLの後に-lclangを入れてみてください。時々変わったリンカーの問題は、物事が間違っていることが原因です。 MesaはシェーダにLLVMを使用しているので、問題の原因になっている可能性があります – Spudd86
これは役に立ちますhttp://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86
@ Spudd86 'g ++ -fPIE test.cpp -o test -I/usr/include/qt -I/usr/include/qt/QtWidgets -lGL -lQt5Widgets -lclang'と同じランタイムエラーが発生します。 – silviubogan