Добавление внешней библиотеки в проект Qt Creator
Как добавить внешнюю библиотеку в проект, созданный Qt Creator RC1 (версия 0.9.2)? Например, функция win32 EnumProcesses()
требует Psapi.lib
быть добавленным в проект, чтобы построить.
8 ответов
Правильный способ сделать это так:
LIBS += -L/path/to -lpsapi
Таким образом, он будет работать на всех платформах, поддерживаемых Qt. Идея заключается в том, что вы должны отделить каталог от имени библиотеки (без расширения и без префикса 'lib'). Конечно, если вы используете специфичную для Windows библиотеку, это действительно не имеет значения.
Если вы хотите сохранить ваши файлы lib в каталоге проекта, вы можете ссылаться на них с помощью $$_PRO_FILE_PWD_
переменная, например:
LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
Ты используешь qmake
проекты? Если это так, вы можете добавить внешнюю библиотеку, используя LIBS
переменная. Например:
win32:LIBS += path/to/Psapi.lib
LIBS += C:\Program Files\OpenCV\lib
не будет работать, потому что вы используете пробелы в программных файлах. В этом случае вы должны добавить кавычки, поэтому результат будет выглядеть следующим образом: LIBS + = "C: \ Program Files \ OpenCV \ lib". Я рекомендую размещать библиотеки не в местах с пробелами;-)
Вы имеете в виду ошибку из-за отсутствия дополнительного пути включения. Попробуйте добавить его с помощью: INCLUDEPATH += C:\path\to\include\files\ Надеюсь, это сработает. С уважением.
А для добавления нескольких файлов библиотеки вы можете написать так:
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/ гибридный E:/DebugLibrary/VTK/Imaging E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Parallel E:/DebugLibrary/VTK/ рендеринг E: / DebugLibrary / VTK / Утилиты E: / DebugLibrary / VTK / VolumeRendering E:/DebugLibrary/VTK/ Виджеты 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
Если вы хотите развернуть свое приложение на компьютерах клиентов, а не использовать ваше приложение только самостоятельно, мы обнаружим, что LIBS+= -Lxxx -lyyy
метод может привести к путанице, если не проблемы.
Мы разрабатываем приложения для Linux, Mac и Windows, используя Qt. Мы отправляем полные, автономные приложения. Таким образом, все несистемные библиотеки должны быть включены в пакет развертывания. Мы хотим, чтобы наши клиенты могли запускать приложение с одной и той же карты памяти USB для всех операционных систем. Из соображений совместимости платформы USB-накопитель должен быть отформатирован как FAT32, который не поддерживает символические ссылки (Linux).
Мы нашли LIBS+= -Lxxx -lyyy
идиома слишком большая из черного ящика:
Мы точно не знаем, что такое filepath библиотеки (статической или динамической), найденной компоновщиком. Это неудобно. Наш компоновщик 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
}
Все зависимости могут быть скопированы в пакет развертывания, так как мы знаем их пути к файлам.
Я хотел бы добавить для полноты картины, что вы также можете добавить только ПУТЬ БИБЛИОТЕКИ, где он будет искать зависимую библиотеку (на которую может не ссылаться напрямую ваш код, но может понадобиться используемая вами библиотека).
Для сравнения, это будет соответствовать тому, что делает среда LIBPATH, но ее вид неясен в Qt Creator и недостаточно документирован.
Способ, которым я пришел, заключается в следующем:
LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"
По сути, если вы не укажете фактическое имя библиотеки, она добавит путь, по которому она будет искать зависимые библиотеки. Разница в синтаксисе невелика, но это очень полезно для предоставления только PATH, где искать зависимые библиотеки. Иногда бывает просто указывать каждый путь для отдельной библиотеки, где вы знаете, что они все находятся в определенной папке, и Qt Creator подберет их.
В .pro: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib
в.h/.cpp: #pragma comment(lib,"user32.lib")
#pragma comment(lib,"psapi.lib")