当我尝试在 Qt 应用程序中使用 libclang 时遇到了一个奇怪的错误。
测试.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 的情况下手动运行 g++,我会得到同样的错误:
$ g++ -fPIE test.cpp -o test -I/usr/include/qt -I/usr/include/qt/QtWidgets -lQt5Widgets -lclang
$ ./test
Two passes with the same argument (-alloca-hoisting) attempted to be registered!
Segmentation fault
- 如果我注释该
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
安装了包含 libclang 头文件和文件 /usr/lib/libclang.so 和 /usr/lib/libclang.a 的包(版本 3.3)。
该程序不起作用的原因是什么,我该如何解决?
更新:我找到了这个页面。跑步LIBGL_ALWAYS_INDIRECT=1 ./test
效果很好,但我想要的不止这些。我不应该设置那个环境变量来运行我的程序。