當我嘗試在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
Shell命令和輸出:
$ 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的,我得到相同的錯誤:
- 如果我評論的
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的,我有clang
包(3.3版)安裝其包括libclang頭和文件/usr/lib/libclang.so和/usr/lib/libclang.a。
該程序無法正常工作的原因是什麼?如何解決?
更新:我發現this page。 運行LIBGL_ALWAYS_INDIRECT=1 ./test
效果不錯,但我想要的不僅僅是這個。我不應該設置該環境變量才能運行我的程序。
嘗試把-lclang放在-lGL之後。有時奇怪的鏈接器問題是由於順序錯誤。 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