Qt

2013-07-30 19 views
6

ile libclang kullanamazsınız Bir Qt uygulamasında libclang kullanmaya çalıştığımda garip bir hatayla karşılaştım.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 

Kabuk sahip ve çıkışı:

$ 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 

el qmake kullanmadan g ++ çalıştırmak için, bir aynı hatayı al:

  • ben program derler ve onu gösterilen penceresiz ana döngüye girer bile çalışır w.show(); satır yorum yaparsanız.
  • CXIndex index = clang_createIndex(0, 0); ve Q_UNUSED(index) satırlarına yorum yaparsam, program derler ve çalışır. Pencere görünürken ana döngüye girer.
  • Ayrıca bunu clang ile derledim ve aynı hata iletisini alıyorum.
  • Web'de arama yaptım ve benzer bir hata iletisiyle yalnızca bu sonucu buldum, ancak bana nasıl yardımcı olabileceğini ve nasıl yardımcı olabileceğini bilmiyorum: http://comments.gmane.org/gmane.comp.compilers.llvm.devel/34647. Ben Qt 5.1 ve Arch Linux kullanıyorum

, ben libclang başlıkları ve dosyalar /usr/lib/libclang.so ve /usr/lib/libclang.a içerir clang paketini (sürüm 3.3) yüklü.

Bu programın çalışmaz olmasının nedeni nedir ve nasıl giderebilirim?


Güncelleme: Ben this page buldum. Çalışıyor LIBGL_ALWAYS_INDIRECT=1 ./test iyi çalışıyor, ama bundan daha fazlasını istiyorum. Programımı çalıştırabilmek için o ortam değişkenini ayarlamamalıydım.

+0

-lcr'yi -lGL'den koymaya çalışın. Bazen garip linker sorunları, yanlış sıraya sahip olmaktan kaynaklanır. Mesa, shader'lar için LLVM kullanmaktadır, bu sizin sorununuzun kaynağı olabilir – Spudd86

+0

Bu yardımcı olabilir http://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86

+0

@ Spudd86 denedim g ++ -fPIE test.cpp -o -I/usr/include/qt -I/usr/include/qt/QtWidgets -lGL -lQt5Widgets -lclang' ve aynı çalışma zamanı hatasını alıyorum. – silviubogan

cevap

2

Neyin yanlış gittiğine dair bir sorunuza cevap verebilirim, nasıl düzelteceğimi bilmiyorum.

İlk olarak 'u kaldırma işlemi, -Wl,--as-needed'u kaldırmadıysanız bunları düzeltmemiştir; yalnızca bu bağlantı düzeltici, libclang'a gerçekten aramamış olduğunuzu fark ettiğinden ve gerçekten programınızı bu bağlantıya bağlamadığınızdan dolayı CXIndex index = clang_createIndex(0, 0); hattı.

Bir şeylerin kırılmasının sebebi, kullandığınız Mesa arka ucunun (ATI veya NVIDIA) clang ile olan bağlarıdır. Oluyormuş gibi görünmektedir programınız ilk yüklendiğinde ve dinamik bağlantılar çözüldüğünde linker libclang ve diğer LLVM şeyler libclang linkleri yükler ve global nesneler için kurucuları çalıştırır, bu da LLVM'nin otomatik olarak geçişler içinde nasıl kaydedildiğini gösterir. Bu noktada, tüm yerleşik LLVM geçişleri kaydedilir, ardından QT başlar ve bir OpenGL içeriği oluşturur, bu nedenle Mesa uygun DRI arka ucunu yükler ve arka ucunda clang/LLVM kullanan sistemde olduğu gibi ve bazı nedenlerden dolayı tüm bu kurucuların yeniden çalıştığı ve LLVM'nin “iki” nin geçtiğini fark etmesi (aslında kendini iki kez kaydettirmeye çalışan aynı geçiş) aynı adı paylaşır ve programınızı iptal eder.

Dediğim gibi, kurucuların neden iki kez çalıştığını ve bunun nasıl durduğunu bilmiyorum. Orada bir cevap denemek alamazsanız mesa-users posta listesinde soran deneyin mesa-dev

Mesa posta listeleri:

DÜZENLEME: Sen yapmalıdır Mesa kopyanizin LLVM aynı sürümü karşı bağlı olduğundan emin Kullanmaya çalıştığınız, eğer pasaport kayıtlarını düzeltmezseniz sorunlarınız en az olacak.

deneyin Eğer iki şey üzerinde kendi bir sorun değildir libLLVM iki sürümü vardır geri alırsanız ls /usr/lib64/llvm/libLLVM-?.?.so yapıyor, ama bir sürümü ve şeyleri açıklamak olabilir farklı bir sürümü karşı Mesa bağlantıları karşı bağlıyoruz eğer.