Добавление внешней библиотеки в проект 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, я не нахожу имен библиотек в Additional Dependenciesпроекте, но проект vs работает хорошо. Означает ли это, что есть еще несколько методов для добавления Additional Dependenciesв vs?
Summer Sun

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

1
Как отметил @DanKorn, для встроенных библиотек Windows вам не нужно (и не следует) указывать путь.
Бур

Почему они не могут просто создать графический интерфейс для добавления библиотеки smh.
GeneCode 08

24

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

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

1
Извините за неубедительный вопрос, но должна ли библиотека psapi быть уже предварительно собранной или QtCreator позаботится о ее создании?
Dfr

11

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

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


Новейшие версии Qt (Creator) всегда хотят (одинарные) косые черты в качестве разделителя каталогов. Единственное исключение - это когда вы используете команду «system» под Windows. Затем вам нужно скормить системе скрытую обратную косую черту, то есть две обратные косые черты. Для того, чтобы заменить все слеша с двумя обратной косой черты можно сделать следующим образом : WINDIR = $$DIR,WINDIR ~=s,/,\\,g
adlag

6

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


4

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

INCLUDEPATH * = E: / DebugLibrary / VTK E: / DebugLibrary / VTK / Common E: / DebugLibrary / VTK / Filtering E: / DebugLibrary / VTK / GenericFiltering E: / DebugLibrary / VTK / Graphics E: / DebugLibrary / VTpport / GUIS / GUIS 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


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/"

По сути, если вы не указываете фактическое имя библиотеки, он добавляет путь, по которому будет выполняться поиск зависимых библиотек. Разница в синтаксисе невелика, но это очень полезно для указания только ПУТЬ, где искать зависимые библиотеки. Иногда бывает просто сложно предоставить каждому пути отдельную библиотеку, где вы знаете, что все они находятся в определенной папке, и 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.