การเพิ่มไลบรารีภายนอกในโครงการ Qt Creator


112

ฉันจะเพิ่มไลบรารีภายนอกลงในโปรเจ็กต์ที่สร้างโดย Qt Creator RC1 (เวอร์ชัน 0.9.2) ได้อย่างไร ตัวอย่างเช่นEnumProcesses()ต้องPsapi.libเพิ่มฟังก์ชัน win32 ในโปรเจ็กต์เพื่อสร้าง

คำตอบ:


216

วิธีที่เหมาะสมในการทำเช่นนี้:

LIBS += -L/path/to -lpsapi

วิธีนี้จะใช้ได้กับทุกแพลตฟอร์มที่รองรับโดย Qt แนวคิดคือคุณต้องแยกไดเร็กทอรีออกจากชื่อไลบรารี (โดยไม่มีนามสกุลและไม่มีคำนำหน้า "lib") แน่นอนหากคุณรวม lib เฉพาะของ Windows สิ่งนี้ไม่สำคัญ

ในกรณีที่คุณต้องการจัดเก็บไฟล์ lib ของคุณในไดเร็กทอรีโปรเจ็กต์คุณสามารถอ้างอิงด้วย$$_PRO_FILE_PWD_ตัวแปรเช่น:

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

2
เป็นไปได้หรือไม่ที่จะระบุตัวแปรสภาพแวดล้อมเป็นเส้นทางไลบรารี ฉันถามเพราะการเขียนชื่อพา ธ แบบฮาร์ดโค้ดลงในไฟล์. pro จะทำลายสิ่งต่าง ๆ หากโปรเจ็กต์ได้รับการพัฒนาโดยคนหลายคนซึ่งอาจไม่ได้ติดตั้งไลบรารีทั้งหมดในตำแหน่งเดียวกัน
antred

สิ่งนี้ได้ผลสำหรับฉัน แต่เมื่อฉันสร้าง vs project ด้วยqmake -tp vcฉันไม่พบชื่อ libs ในAdditional Dependenciesโครงการ แต่ vs project ทำงานได้ดี หมายความว่ามีวิธีอื่นในการบวกAdditional Dependenciesvs หรือไม่?
Summer Sun

1
ฉันไม่คิดว่าคุณจำเป็นต้องระบุเส้นทางสำหรับไลบรารี Windows ในตัว ไฟล์ .pro ของเรามีสายการเช่นนี้ในส่วน win32 LIBS += -lGdi32นี้:
แดนกร

1
ดังที่ @DanKorn กล่าวไว้สำหรับไลบรารี Windows ในตัวคุณไม่จำเป็นต้อง (และไม่ควร) ระบุเส้นทาง
บุ

ทำไมพวกเขาไม่สามารถสร้าง GUI เพื่อเพิ่มห้องสมุด smh
GeneCode

24

คุณกำลังใช้qmakeโปรเจ็กต์อยู่ใช่ไหม ในกรณีนี้คุณสามารถเพิ่มไลบรารีภายนอกโดยใช้LIBSตัวแปร เช่น:

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

1
ขออภัยสำหรับคำถามง่อย ๆ แต่ห้องสมุด psapi ควรสร้างไว้ล่วงหน้าแล้วหรือ QtCreator จะดูแลการสร้าง?
Dfr

11

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

จะไม่ทำงานเนื่องจากคุณกำลังใช้ช่องว่างใน Program Files ในกรณีนี้คุณต้องเพิ่มคำพูดดังนั้นผลที่ได้จะมีลักษณะเช่นนี้LIBS + = "C: \ Program Files \ OpenCV \ lib" ฉันขอแนะนำให้วางห้องสมุดในสถานที่ที่ไม่ใช่พื้นที่สีขาว ;-)


Qt (Creator) เวอร์ชันล่าสุดมักต้องการ (single) ไปข้างหน้า slashes เป็นตัวคั่นไดเร็กทอรี ข้อยกเว้นเพียงอย่างเดียวคือเมื่อคุณใช้คำสั่ง "system" ใน Windows จากนั้นคุณต้องป้อนระบบโดยใช้เครื่องหมายทับย้อนกลับที่หลีกเลี่ยงกล่าวคือเครื่องหมายทับถอยหลังสองตัว เพื่อแทนที่ทับทั้งหมดที่มีสองทับย้อนกลับสามารถทำได้ดังนี้WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

ข้อผิดพลาดที่คุณหมายถึงเกิดจากไม่มีเส้นทางการรวมเพิ่มเติม ลองเพิ่มด้วย: INCLUDEPATH + = C: \ path \ to \ include \ files \ หวังว่าจะใช้งานได้ ความนับถือ.


4

และหากต้องการเพิ่มไฟล์ไลบรารีหลายไฟล์คุณสามารถเขียนได้ดังนี้:

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTK / GUISupport / Qt E: / DebugLibrary / VTK / Hybrid E: / DebugLibrary / VTK / Imaging E: / DebugLibrary / VTK / IO E: / DebugLibrary / VTK / Parallel E: / DebugLibrary / VTK / Rendering E: / DebugLibrary / VTK / Utilities E : / DebugLibrary / VTK / VolumeRendering E: / DebugLibrary / VTK / Widgets E: / DebugLibrary / VTK / Wrapping

LIBS * = เลอ: / DebugLibrary / VTKBin / bin / ปล่อย -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtk ไฮบริด -lvtk ระดับเสียงเรนเดอร์ -lQVTKWidgetPlugin -lvtkGenericFiltering


3

หากคุณต้องการปรับใช้แอปพลิเคชันของคุณบนเครื่องของลูกค้าแทนที่จะใช้แอปพลิเคชันของคุณเพียงอย่างเดียวเราพบว่า LIBS+= -Lxxx -lyyyวิธีนี้อาจทำให้เกิดความสับสนได้หากไม่ใช่ปัญหา

เราพัฒนาแอปพลิเคชันสำหรับ Linux, Mac และ Windows โดยใช้ Qt เราจัดส่งแอปพลิเคชันแบบสแตนด์อโลนที่สมบูรณ์ ดังนั้นไลบรารีที่ไม่ใช่ระบบทั้งหมดควรรวมอยู่ในแพ็คเกจการปรับใช้ เราต้องการให้ลูกค้าของเราสามารถเรียกใช้แอปพลิเคชันจากแท่ง USB เดียวกันสำหรับทุกระบบปฏิบัติการ ด้วยเหตุผลด้านความเข้ากันได้ของแพลตฟอร์มจึงต้องฟอร์แมตแท่ง USB เป็น FAT32 ซึ่งไม่รองรับ symlinks (Linux)

เราพบLIBS+= -Lxxx -lyyyสำนวนของกล่องดำมากเกินไป:

  1. เราไม่ทราบแน่ชัดว่า filepath คืออะไรของไลบรารี (แบบคงที่หรือไดนามิก) ที่ผู้เชื่อมโยงพบ สิ่งนี้ไม่สะดวก ตัวเชื่อมต่อ Mac ของเราพบว่า libs แตกต่างจากที่เราคิดว่าควรใช้เป็นประจำ สิ่งนี้เกิดขึ้นหลายครั้งกับไลบรารี OpenSSL ที่ Mac linker พบและใช้เวอร์ชัน OpenSSL ที่เก่ากว่าและเข้ากันไม่ได้แทนที่จะเป็นเวอร์ชันที่เราร้องขอ

  2. เราไม่สามารถจ่ายได้ที่ตัวเชื่อมโยงใช้ symlinks กับไลบรารีเนื่องจากจะทำให้แพ็คเกจการปรับใช้งานเสียหาย

  3. เราต้องการดูจากชื่อของไลบรารีว่าเราเชื่อมโยงไลบรารีแบบคงที่หรือไดนามิก

ดังนั้นสำหรับกรณีเฉพาะของเราเราใช้เฉพาะ filepaths สัมบูรณ์และตรวจสอบว่ามีอยู่หรือไม่ เราลบ symlink ทั้งหมด

อันดับแรกเราจะหาระบบปฏิบัติการที่เราใช้และใส่ไว้ในตัวแปร CONFIG และตัวอย่างเช่นสำหรับ Linux 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 ทำ แต่มันคลุมเครือใน Qt Creator และไม่ได้รับการบันทึกไว้อย่างดี

วิธีที่ฉันมารอบนี้มีดังต่อไปนี้:

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

โดยพื้นฐานแล้วถ้าคุณไม่ได้ระบุชื่อไลบรารีจริงมันจะเพิ่มพา ธ ไปยังตำแหน่งที่จะค้นหาไลบรารีที่อ้างอิง ความแตกต่างของไวยากรณ์มีเพียงเล็กน้อย แต่มีประโยชน์มากในการจัดหา PATH เพื่อค้นหาไลบรารีที่อ้างอิง บางครั้งก็เป็นเพียงความเจ็บปวดในการจัดหาไลบรารีแต่ละเส้นทางที่คุณรู้ว่าทั้งหมดอยู่ในโฟลเดอร์ใดโฟลเดอร์หนึ่งและผู้สร้าง Qt จะหยิบมันขึ้นมา


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.