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

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

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

 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

не будет работать, потому что вы используете пробелы в Program Files. В этом случае вам нужно добавить кавычки, поэтому результат будет выглядеть так: 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 / 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

ЛИЭС * = -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 идиому слишком много черного ящика:

  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 } 

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

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

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

То, как я пришел, это следующее:

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

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

Interesting Posts
Давайте будем гением компьютера.