Добавление внешней библиотеки в проект Qt Creator

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

Ответ 1

Правильный способ сделать это выглядит следующим образом:

LIBS += -L/path/to -lpsapi

Таким образом, он будет работать на всех платформах, поддерживаемых Qt. Идея состоит в том, что вам нужно отделить каталог от имени библиотеки (без расширения и без префикса lib). Конечно, если вы включаете в себя конкретную версию Windows, это действительно не имеет значения.

Если вы хотите сохранить ваши файлы lib в каталоге проекта, вы можете ссылаться на них с помощью переменной $$_PRO_FILE_PWD_, например:

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

Ответ 2

Используете ли вы проекты qmake? Если это так, вы можете добавить внешнюю библиотеку, используя переменную LIBS. Например:

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

Ответ 3

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

не будет работать, потому что вы используете пробелы в Program Files. В этом случае вам нужно добавить кавычки, поэтому результат будет выглядеть следующим образом: LIBS + = "C:\Program Files\OpenCV\lib" . Я рекомендую размещать библиотеки в небезопасных местах; -)

Ответ 4

Вы подразумеваете ошибку из-за отсутствия дополнительного пути include. Попробуйте добавить его с помощью: INCLUDEPATH + = C:\path\to\include\files \ Надеюсь, что это работает. С наилучшими пожеланиями.

Ответ 5

И чтобы добавить несколько файлов библиотеки, вы можете написать, как показано ниже:

INCLUDEPATH * = E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Фильтрация E:/DebugLibrary/VTK/GenericFiltering E:/DebugLibrary/VTK/Графика 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/Утилиты E:/DebugLibrary/VTK/VolumeRendering E:/DebugLibrary/VTK/Виджеты E:/DebugLibrary/VTK/Wrapping

LIBS * = -LE:/DebugLibrary/VTKBin/bin/release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

Ответ 6

Если вы хотите развернуть свое приложение на компьютерах клиентов, а не использовать свое приложение только самостоятельно, мы обнаружим, что метод LIBS+= -Lxxx -lyyy может привести к путанице, если не проблемы.

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

Мы обнаружили, что idiom LIBS+= -Lxxx -lyyy слишком много черного ящика:

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

  • Мы не можем позволить себе, чтобы компоновщик использовал символические ссылки для библиотек, так как это сломало бы пакет развертывания.

  • Мы хотим видеть из имя библиотеки, привязываем ли мы статическую или динамическую библиотеку.

Итак, для нашего конкретного случая мы используем только абсолютные пути к файлам и проверяем, существуют ли они. Мы удаляем все символические ссылки.

Сначала мы узнаем, какую операционную систему мы используем, и поместим ее в переменную 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
}

Все зависимости могут быть скопированы в пакет развертывания, поскольку мы знаем их пути к файлам.

Ответ 7

Я хотел бы добавить для полноты картины, что вы также можете добавить только ПУТЬ БИБЛИОТЕКИ, где он будет искать зависимую библиотеку (которая может не иметь прямой ссылки в вашем коде, но библиотека, которую вы используете, может нуждаться в ней).

Для сравнения, это будет соответствовать тому, что делает среда LIBPATH, но ее вид неясен в Qt Creator и недостаточно документирован.

Способ, которым я пришел, заключается в следующем:

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

По сути, если вы не укажете фактическое имя библиотеки, она добавит путь, по которому она будет искать зависимые библиотеки. Разница в синтаксисе невелика, но это очень полезно для предоставления только PATH, где искать зависимые библиотеки. Иногда бывает просто указывать каждый путь для отдельной библиотеки, где вы знаете, что они все находятся в определенной папке, и Qt Creator подберет их.

Ответ 8

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

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

#pragma comment(lib,"psapi.lib")