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


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

7 100

7 ответов:

правильный способ сделать это так:

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 файлы\OpenCV\lib

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

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

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

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 * = - 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

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

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

мы нашли LIBS+= -Lxxx -lyyy идиома слишком много "черного ящика":

  1. мы точно не знаем, что такое путь к файлу (статической или динамической) библиотеки, которая была найдена компоновщиком. Это неудобно. Наш Mac linker регулярно находил библиотеки, отличные от тех, которые мы думали, что их следует использовать. Это произошло несколько раз с библиотеками 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/"

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