Додавання зовнішньої бібліотеки до проекту Qt Creator


112

Як я можу додати зовнішню бібліотеку до проекту, створеного Qt Creator RC1 (версія 0.9.2)? Наприклад, функцію win32 EnumProcesses()потрібно Psapi.libдодати в проект для складання.

Відповіді:


216

Правильний спосіб це зробити так:

LIBS += -L/path/to -lpsapi

Таким чином він буде працювати на всіх платформах, підтримуваних Qt. Ідея полягає в тому, що вам потрібно відокремити каталог від імені бібліотеки (без розширення та без будь-якого префікса "lib"). Звичайно, якщо ви включаєте специфічну для Windows ліб, це насправді не має значення.

У випадку, якщо ви хочете зберегти файли lib в каталозі проектів, ви можете посилатися на них зі $$_PRO_FILE_PWD_змінною, наприклад:

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

2
Чи можна вказати змінну середовища як шлях до бібліотеки? Я запитую, тому що написання жорстких коду імен шляхів у файл .pro порушить речі, якщо проект розробляється декількома людьми, які можуть не мати всі бібліотеки встановлені в одних і тих же місцях.
antred

Це працювало для мене, але коли я генерую проект vs qmake -tp vc, я не знаходжу імен libs у Additional Dependenciesпроекті, але проект vs працює добре. Чи означає це, що є ще якісь методи, які потрібно додати Additional Dependenciesдо vs?
Літнє сонце

1
Я не думаю, що вам потрібно вказувати шлях для вбудованої бібліотеки Windows. Наші .pro файли мають такі рядки в розділі win32: LIBS += -lGdi32.
Дан Корн

1
Як зазначав @DanKorn, для вбудованих бібліотек Windows вам не потрібно (і не слід) вказувати шлях.
bur

Чому вони не можуть просто створити графічний інтерфейс, щоб додати бібліотеку smh.
GeneCode

24

Ви використовуєте qmakeпроекти? Якщо так, ви можете додати зовнішню бібліотеку за допомогою LIBSзмінної. Наприклад:

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

1
Вибачте за кульгаве запитання, але чи має бути бібліотека psapi вже побудована, або QtCreator подбає про її створення?
Дфр

11

LIBS + = C: \ програмні файли \ OpenCV \ lib

не працюватиме, оскільки ви використовуєте пробіли у файлах програми. У цьому випадку вам слід додати лапки, тому результат буде виглядати приблизно так : LIBS + = "C: \ Program Files \ OpenCV \ lib" . Я рекомендую розміщувати бібліотеки в місцях, що не є пробілами ;-)


Найновіші версії Qt (Creator) завжди хочуть (поодинокі) пересічення вперед як роздільник каталогів. Єдиний виняток - коли ви використовуєте команду "system" під Windows. Тоді вам потрібно подати систему на білу відстань, що вийшла назад, тобто два косої коси. Для того, щоб замінити всі слеша з двома зворотної косої межі можна зробити наступним чином : WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

Ви маєте на увазі помилку через відсутність додаткового шляху включення. Спробуйте додати його за допомогою: INCLUDEPATH + = C: \ шлях \ до \ включити \ файли \ Сподіваюся, він працює. З повагою


4

І щоб додати декілька файлів бібліотеки, ви можете написати наступне:

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

ЛІЕС * = -LE: / DebugLibrary / VTKBin / бен / реліз -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

Якщо ви хочете розгорнути свою програму на машинах клієнтів, а не використовувати свою програму лише самостійно, ми виявимо, що LIBS+= -Lxxx -lyyy метод може призвести до плутанини, якщо не до проблем.

Ми розробляємо додатки для Linux, Mac та Windows за допомогою Qt. Ми постачаємо комплектні, автономні програми. Отже, всі несистемні бібліотеки повинні бути включені в пакет розгортання. Ми хочемо, щоб наші клієнти мали змогу запускати програму з однієї USB-накопичувачі для всіх ОС. З міркувань сумісності платформи USB-накопичувач повинен бути відформатований як FAT32, який не підтримує (Linux) посилання.

Ми знайшли LIBS+= -Lxxx -lyyyідіому занадто багато чорної скриньки:

  1. Ми точно не знаємо, що є файловим шляхом (статичної або динамічної) бібліотеки, яку знайшов лінкер. Це незручно. Наш Mac-лінкер регулярно виявляв, що лійки відрізняються від тих, які ми вважали, що їх слід використовувати. Це траплялося кілька разів з бібліотеками OpenSSL, де лінкер Mac знаходив і використовував власну - старішу, несумісну - версію OpenSSL, а не нашу запитувану версію.

  2. Ми не можемо дозволити собі, що лінкер використовує посилання на бібліотеки, оскільки це порушить пакет розгортання.

  3. З назви бібліотеки ми хочемо зрозуміти, чи зв’язуємо ми статичну або динамічну бібліотеку.

Тож для нашого конкретного випадку ми використовуємо лише абсолютні файлові контури та перевіряємо, чи існують вони. Видаляємо всі посилання.

Спочатку ми з'ясовуємо, яку операційну систему ми використовуємо, і поміщаємо це в змінну CONFIG. І, наприклад, для Linux 64bit, тоді:

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

Я хотів би додати заради повноти, що ви також можете додати просто БІБЛІОТЕЧНИЙ ПАРТ, де вона буде шукати залежну бібліотеку (яка може не бути безпосередньо посилається у вашому коді, але бібліотека, яку ви використовуєте, може знадобитися).

Для порівняння, це відповідало б тому, що робить середовище LIBPATH, однак його вид незрозумілий у Qt Creator і недостатньо задокументований.

Спосіб, яким я обійшов це, наступний:

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

Якщо ви не вказали фактичне ім’я бібліотеки, воно додає шлях до того, де він буде шукати залежні бібліотеки. Різниця в синтаксисі невелика, але це дуже корисно для надання лише PATH, де шукати залежні бібліотеки. Іноді це просто біль поставити кожній контуру окрему бібліотеку, де ви знаєте, що вони знаходяться у певній папці, і Qt Creator підбере їх.


0

в .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

в .h / .cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.