2013-07-30 5 views
6

के साथ libclang का उपयोग नहीं कर सकता है जब मैंने एक क्यूटी अनुप्रयोग में 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 का उपयोग किए बिना जी ++ चलाने के लिए, मैं एक ही त्रुटि प्राप्त करें:

  • अगर मैं w.show(); लाइन कार्यक्रम संकलित करता है तथा भले ही यह पता चला खिड़की के बिना मुख्य पाश में प्रवेश चलाता टिप्पणी।
  • यदि मैं CXIndex index = clang_createIndex(0, 0); और Q_UNUSED(index) लाइनों पर टिप्पणी करता हूं, तो प्रोग्राम संकलित और चलाता है। यह खिड़की के दृश्य के साथ मुख्य पाश में प्रवेश करता है।
  • मैंने इसे क्लैंग के साथ भी संकलित किया और मुझे एक ही त्रुटि संदेश मिलता है।
  • मैंने वेब की खोज की और मुझे केवल एक ही त्रुटि संदेश के साथ यह परिणाम मिला लेकिन मुझे नहीं पता कि यह मेरी मदद कैसे कर सकता है: http://comments.gmane.org/gmane.comp.compilers.llvm.devel/34647

मैं क्यूटी 5.1 और ArchLinux उपयोग कर रहा हूँ, मैं clang पैकेज (संस्करण 3.3) स्थापित जिसमें शामिल libclang हेडर और फ़ाइलों /usr/lib/libclang.so और /usr/lib/libclang.a है।

यह कारण क्यों है कि यह प्रोग्राम काम नहीं करता है और मैं इसे कैसे ठीक कर सकता हूं?


अद्यतन: मैं this page पाया है। LIBGL_ALWAYS_INDIRECT=1 ./test चल रहा है अच्छी तरह से काम करता है, लेकिन मुझे इससे अधिक चाहिए। मुझे अपने पर्यावरण को चलाने में सक्षम होने के लिए उस पर्यावरण चर को सेट नहीं करना चाहिए।

+0

-एलजीएल के बाद -lclang डालने का प्रयास करें। कभी-कभी अजीब लिंकर मुद्दे गलत क्रम में चीजें होने के कारण होते हैं। मेसा शेडर्स के लिए एलएलवीएम का उपयोग करता है ताकि आपकी समस्या का स्रोत हो सकता है – Spudd86

+0

यह सहायक हो सकता है http://llvm.org/bugs/show_bug.cgi?id=6801 – Spudd86

+0

@ Spudd86 मैंने कोशिश की 'g ++ -fPIE test.cpp -o परीक्षण- I/usr/शामिल/qt -I/usr/शामिल/qt/QtWidgets -lGL -lQt5Widgets -lclang' और मुझे एक ही रनटाइम त्रुटि मिलती है। – silviubogan

उत्तर

2

मैं गलत होने के बारे में आपके प्रश्न का उत्तर दे सकता हूं, मुझे नहीं पता कि इसे कैसे ठीक किया जाए।

सबसे पहले, CXIndex index = clang_createIndex(0, 0); को हटाकर चीजों को ठीक नहीं किया जाएगा यदि आपके पास -Wl,--as-needed नहीं है, तो इसे हटाने से केवल इसे ठीक किया जाता है क्योंकि लिंकर ने देखा है कि आपने वास्तव में libclang में कॉल नहीं किया था और इसलिए वास्तव में आपके प्रोग्राम को इसके बिना लिंक नहीं किया था CXIndex index = clang_createIndex(0, 0); लाइन।

चीजों को तोड़ने का कारण यह है कि जो भी मेसा बैकएंड आप उपयोग कर रहे हैं (या तो अति या एनवीआईडीआईए) भी क्लैंग के खिलाफ लिंक करता है। ऐसा प्रतीत होता है कि जब आपका प्रोग्राम पहले लोड होता है और डायनामिक लिंक हल हो जाते हैं तो लिंकर जाता है और libclang और अन्य एलएलवीएम सामान libclang लिंक को वैश्विक वस्तुओं के लिए कन्स्ट्रक्टर से जोड़ता है और चलाता है, इस प्रकार एलएलवीएम रजिस्ट्रार को स्वचालित रूप से पास करता है। तो इस बिंदु पर सभी एलएलवीएम पास में पंजीकृत हैं, फिर क्यूटी शुरू होता है और यह ओपनजीएल संदर्भ बनाता है ताकि मेसा उपयुक्त डीआरआई बैकएंड लोड कर सके और जैसा कि यह आपके सिस्टम पर होता है कि बैकएंड क्लैंग/एलएलवीएम का उपयोग करता है, और किसी कारण से ऐसा लगता है कि वे सभी रचनाकार फिर से चलते हैं और एलएलवीएम नोटिस करता है कि "दो" पास (वास्तव में एक ही पास दो बार पंजीकरण करने की कोशिश कर रहा है) वही नाम साझा करें और आपके प्रोग्राम को बंद कर दें।

जैसा कि मैंने कहा था कि मैं वास्तव में नहीं जानता कि निर्माता दो बार क्यों चल रहे हैं और मुझे नहीं पता कि इसे कैसे रोकें। यदि आप एक जवाब वहाँ की कोशिश नहीं मिलता mesa-users मेलिंग सूची पर पूछने का प्रयास करें mesa-dev

मेसा मेलिंग सूची:

संपादित करें: आप सुनिश्चित करना चाहिए कि मेसा के अपने प्रतिलिपि LLVM के समान संस्करण के खिलाफ जुड़ा हुआ है कि आप उपयोग करने की कोशिश कर रहे हैं, अगर यह पास पंजीकरण की बात तय नहीं कर रहा है तो आपकी समस्याओं का सबसे कम होगा।

ls /usr/lib64/llvm/libLLVM-?.?.so करने का प्रयास करें यदि आपको दो चीजें मिलती हैं तो आपके पास libLLVM के दो संस्करण होते हैं जो कि स्वयं की कोई समस्या नहीं है, लेकिन यदि आप एक संस्करण के खिलाफ लिंक कर रहे हैं और मेसा लिंक एक अलग संस्करण के खिलाफ लिंक कर रहे हैं जो चीजों को समझा सकता है।