Qt क्रिएटर प्रोजेक्ट में बाहरी लाइब्रेरी जोड़ना


112

मैं Qt क्रिएटर RC1 (संस्करण 0.9.2) द्वारा निर्मित परियोजना में बाहरी पुस्तकालय कैसे जोड़ सकता हूं? उदाहरण के लिए, win32 फ़ंक्शन EnumProcesses()को Psapi.libबनाने के लिए प्रोजेक्ट में जोड़ा जाना चाहिए ।

जवाबों:


216

ऐसा करने का उचित तरीका इस प्रकार है:

LIBS += -L/path/to -lpsapi

इस तरह यह Qt द्वारा समर्थित सभी प्लेटफार्मों पर काम करेगा। विचार यह है कि आपको निर्देशिका को पुस्तकालय के नाम से अलग करना होगा (विस्तार के बिना और बिना किसी 'लिबास' उपसर्ग के)। बेशक, अगर आप विंडोज विशिष्ट लिबास में शामिल हैं, तो यह वास्तव में मायने नहीं रखता।

यदि आप प्रोजेक्ट डायरेक्टरी में अपनी लिबास फाइल्स स्टोर करना चाहते हैं, तो आप उन्हें $$_PRO_FILE_PWD_वेरिएबल के साथ रेफर कर सकते हैं , जैसे:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
क्या पुस्तकालय पथ के रूप में पर्यावरण चर को निर्दिष्ट करना संभव है? मैं पूछ रहा हूं क्योंकि .pro फ़ाइल में हार्डकोड किए गए पथ नाम लिखने से चीजें टूट जाएंगी यदि एक परियोजना कई लोगों द्वारा विकसित की जाती है, जिनके पास एक ही स्थान पर स्थापित सभी लाइब्रेरी नहीं हो सकती हैं।
antred

इसने मेरे लिए काम किया, लेकिन जब मैं एक बनाम परियोजना उत्पन्न करता हूं, तो मुझे इस परियोजना के qmake -tp vcकोई लिबास नाम नहीं मिलते हैं Additional Dependencies, लेकिन बनाम परियोजना अच्छी तरह से चलती है। इसका मतलब है कि Additional Dependenciesबनाम में जोड़ने के लिए कुछ अन्य तरीके हैं ?
ग्रीष्मकालीन सूर्य

1
मुझे नहीं लगता कि आपको एक अंतर्निहित विंडोज लाइब्रेरी के लिए एक पथ निर्दिष्ट करने की आवश्यकता है। हमारी .pro फाइलों में win32 सेक्शन की तरह लाइनें होती हैं LIBS += -lGdi32:।
डैन कोर्न

1
जैसा कि @DanKorn ने उल्लेख किया है, अंतर्निहित विंडोज पुस्तकालयों के लिए आपको एक पथ निर्दिष्ट करने (और नहीं करना चाहिए) की आवश्यकता नहीं है।
बर

वे लाइब्रेरी smh जोड़ने के लिए सिर्फ GUI क्यों नहीं बना सकते।
जीनकोड

24

क्या आप qmakeपरियोजनाओं का उपयोग कर रहे हैं ? यदि ऐसा है, तो आप LIBSचर का उपयोग करके एक बाहरी पुस्तकालय जोड़ सकते हैं । उदाहरण के लिए:

win32:LIBS += path/to/Psapi.lib

1
लंगड़ा सवाल के लिए खेद है, लेकिन क्या psapi पुस्तकालय पहले से ही बनाया जाना चाहिए या QtCreator इसे बनाने का ख्याल रखेगा?
Dfr

11

LIBS + = C: \ Program Files \ OpenCV \ lib

काम नहीं करेगा क्योंकि आप प्रोग्राम फाइल्स में व्हाइट-स्पेस का उपयोग कर रहे हैं। इस स्थिति में आपको उद्धरण जोड़ना होगा, इसलिए परिणाम इस तरह दिखाई देगा: LIBS + = "C: \ Program Files \ OpenCV \ lib" । मैं गैर-सफेद स्थानों में पुस्तकालयों को रखने की सलाह देता हूं ;-)


क्यूटी (क्रिएटर) के नवीनतम संस्करण हमेशा चाहते हैं (सिंगल) फॉरवर्ड स्लैश को डायरेक्टरी सेपरेटर के रूप में। एकमात्र अपवाद तब है जब आप विंडोज के तहत "सिस्टम" कमांड का उपयोग करते हैं। फिर आपको सिस्टम को एक बची हुई पिछड़ी स्लैश को खिलाने की जरूरत है, यह कहना है कि दो पिछड़े स्लैश हैं। : इस प्रकार दो पिछड़े स्लैश के साथ सभी फ़ॉरवर्ड स्लैश प्रतिस्थापित करने के लिए किया जा सकता है WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

आपके द्वारा की गई त्रुटि अनुपलब्ध अतिरिक्त पथ के कारण है। इसे इसके साथ जोड़ने का प्रयास करें: INCLUDEPATH + = C: \ path \ to \ शामिल \ files \ Hope यह काम करता है। सादर।


4

और कई पुस्तकालय फ़ाइलों को जोड़ने के लिए आप नीचे लिख सकते हैं:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / फ़िल्टरिंग E: / DebugLibrary / VTK / Genericililtering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUKUP Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / इमेजिंग E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / प्रतिपादन E: / DebugLibrary / VTK / उपयोगिताएँ E : / डीबग्लुवेड्स / वीटीके / वॉल्यूम रेंडरिंग ई: / डीबग्लुवेट / वीटीके / विजेट ई: / डीबग्लुइट्स / वीटीके / रैपिंग

* -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

यदि आप अपना आवेदन केवल अपने आवेदन का उपयोग करने के बजाय ग्राहकों की मशीनों पर तैनात करना चाहते हैं, तो हम पाते हैं कि LIBS+= -Lxxx -lyyy यदि समस्याएँ हैं तो यह विधि भ्रम पैदा कर सकती है।

हम क्यूटी का उपयोग करके लिनक्स, मैक और विंडोज के लिए एप्लिकेशन विकसित करते हैं। हम पूर्ण, स्टैंड-अलोन एप्लिकेशन शिप करते हैं। इसलिए सभी गैर-सिस्टम पुस्तकालयों को परिनियोजन पैकेज में शामिल किया जाना चाहिए। हम चाहते हैं कि हमारे ग्राहक सभी OS के लिए एक ही USB स्टिक से एप्लिकेशन चला सकें। प्लेटफ़ॉर्म अनुकूलता के कारणों के लिए USB स्टिक को FAT32 के रूप में स्वरूपित किया जाना चाहिए, जो (लिनक्स) सहानुभूति का समर्थन नहीं करता है।

हमें LIBS+= -Lxxx -lyyyमुहावरा बहुत अधिक ब्लैक बॉक्स मिला:

  1. हम बिल्कुल नहीं जानते कि फ़ाइलपैथ (स्थिर या गतिशील) लाइब्रेरी का क्या है जो लिंकर द्वारा पाया गया है। यह असुविधाजनक है। हमारे मैक लिंकर ने नियमित रूप से उन लोगों से भिन्नताएं पाई हैं जिन्हें हमने सोचा था कि इसका उपयोग किया जाना चाहिए। यह कई बार ओपनएसएसएल पुस्तकालयों के साथ हुआ जहां मैक लिंकर ने अपने अनुरोधित संस्करण के बजाय अपने पुराने, असंगत - ओपनएसएसएल संस्करण का उपयोग किया।

  2. हम इस बात को बर्दाश्त नहीं कर सकते कि लिंकर पुस्तकालयों के लिए सीमलिंक का उपयोग करता है क्योंकि यह तैनाती पैकेज को तोड़ देगा।

  3. हम लाइब्रेरी के नाम से देखना चाहते हैं कि क्या हम एक स्टैटिक या डायनेमिक लाइब्रेरी को लिंक करते हैं।

इसलिए हमारे विशेष मामले के लिए हम केवल निरपेक्ष फ़ाइलपथ का उपयोग करते हैं और जाँचते हैं कि वे मौजूद हैं या नहीं। हम सभी सीमलिंक निकालते हैं।

पहले हमें पता चलता है कि हम किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं और इसे CONFIG वेरिएबल में डाल रहे हैं। और, लिनक्स 64 बिट के लिए उदाहरण के लिए, फिर:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

सभी निर्भरताएँ परिनियोजन पैकेज में कॉपी की जा सकती हैं क्योंकि हम उनकी फ़ाइलपथ जानते हैं।


1

मैं पूर्णता के लिए जोड़ना चाहूंगा कि आप केवल LIBRARY PATH को भी जोड़ सकते हैं जहाँ यह एक आश्रित पुस्तकालय की तलाश करेगा (जो आपके कोड में सीधे संदर्भित नहीं हो सकता है लेकिन आपके द्वारा उपयोग किए जाने वाले पुस्तकालय की आवश्यकता हो सकती है)।

तुलना के लिए, यह LIBPATH वातावरण के अनुरूप है, लेकिन क्यूटी निर्माता में इसकी तरह का अस्पष्ट है और अच्छी तरह से प्रलेखित नहीं है।

जिस तरह से मैं इसके आसपास आया वह निम्नलिखित है:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

अनिवार्य रूप से यदि आप वास्तविक पुस्तकालय नाम प्रदान नहीं करते हैं, तो यह उस पथ को जोड़ता है जहां यह निर्भर पुस्तकालयों की खोज करेगा। सिंटैक्स में अंतर छोटा है, लेकिन यह केवल उन पैट की आपूर्ति करने के लिए बहुत उपयोगी है जहां निर्भर पुस्तकालयों की तलाश है। यह कुछ समय के लिए प्रत्येक पथ व्यक्तिगत पुस्तकालय की आपूर्ति करने के लिए एक दर्द है, जहां आप जानते हैं कि वे सभी कुछ निश्चित फ़ोल्डर में हैं और क्यूटी निर्माता उन्हें उठाएगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.