2013-07-30 4 views
6

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を実行してもうまく動作しますが、これ以上必要です。自分のプログラムを実行できるように、その環境変数を設定する必要はありません。

+0

-lGLの後に-lclangを入れてみてください。時々変わったリンカーの問題は、物事が間違っていることが原因です。 MesaはシェーダにLLVMを使用しているので、問題の原因になっている可能性があります – Spudd86

+0

これは役に立ちますhttp://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86

+0

@ Spudd86 'g ++ -fPIE test.cpp -o test -I/usr/include/qt -I/usr/include/qt/QtWidgets -lGL -lQt5Widgets -lclang'と同じランタイムエラーが発生します。 – silviubogan

答えて

2

私はあなたに何がうまくいかないのかという質問に答えることができます。私はそれを修正する方法がわかりません。

最初に、-Wl,--as-neededを削除していないと修正されませんでした。リンカがあなたが実際にlibclangを呼び出さなかったことに気づき、 CXIndex index = clang_createIndex(0, 0);行。

あなたが使用しているメサのバックエンド(ATIまたはNVIDIAのいずれか)もclangとリンクしているため、破損している理由です。何が起こっているかは、プログラムが最初にロードされ、ダイナミックリンクが解決されたときにリンカがlibclangやその他のLLVMを読み込んでlibclangがグローバルオブジェクトのコンストラクタにリンクして実行するというものです。この時点で、組み込みのLLVMパスはすべて登録され、その後QTが起動し、OpenGLコンテキストが作成され、Mesaは適切なDRIバックエンドをロードし、システム上でバックエンドがclang/LLVMを使用するようになり、何らかの理由でこれらのコンストラクタはすべて再実行され、LLVMは "2回"のパス(実際には2回自身を登録しようとする同じパス)が同じ名前を共有し、プログラムを中止することに気付きます。

私は実際にコンストラクタが2回実行されている理由は分かりませんが、私はそれを止める方法がわかりません。あなたはメサのコピーがLLVMの同じバージョンに対してリンクされていることを確認する必要があります。

EDIT:あなたはそこに答えを得ることはありません場合はmesa-dev

メサのメーリングリストを試しmesa-usersメーリングリストで尋ねてみてくださいパスの登録を修正していない場合、あなたが使用しようとしているものは、あなたの問題の中で最も少なくなります。

あなたが2つのバージョンのlibLLVMを持っていれば、自分自身で問題はないが、あるバージョンとMesaリンクをリンクしている場合は、説明できるかもしれない別のバージョンとリンクしている。

関連する問題