Ссылка на библиотеку dl в Linux QTCreator [дубликат]

Вы должны использовать Func<Task> вместо Action:

[Test]
public void TestFail()
{
    Func<Task> f = async () => { await Fail(); };
    f.ShouldThrow<Exception>();            
}

Это вызовет следующее расширение, которое используется для проверки асинхронных методов

public static ExceptionAssertions<TException> ShouldThrow<TException>(
    this Func<Task> asyncAction, string because = "", params object[] becauseArgs)
        where TException : Exception        

Внутренне это метод выполнит задачу, возвращенную Func, и дождитесь ее. Что-то вроде

try
{
    Task.Run(asyncAction).Wait();
}
catch (Exception exception)
{
    // get actual exception if it wrapped in AggregateException
}

Обратите внимание, что сам тест является синхронным.

100
задан sashoalm 14 February 2013 в 12:45
поделиться

7 ответов

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

LIBS += -L/path/to -lpsapi

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

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

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
201
ответ дан Tamás Szelei 21 August 2018 в 16:57
поделиться
  • 1
    Это правильный ответ на этот пост. – sivabudh 4 June 2010 в 20:46
  • 2
    +1, потому что он рассматривает кросс-платформенное решение, самый полный ответ. – morde 18 August 2010 в 10:33
  • 3
    Можно ли указать переменную среды как путь к библиотеке? Я прошу, потому что запись жестко заданных имен пути в файл .pro приведет к поломке вещей, если проект разрабатывается несколькими людьми, у которых может быть не все библиотеки, установленные в тех же местах. – antred 20 May 2015 в 09:56
  • 4
    Это работало для меня, но когда я создаю проект vs с qmake -tp vc, я не нахожу имен libs в Additional Dependencies проекта, но проект vs выполняется хорошо. Означает ли это, что есть некоторые другие способы добавления Additional Dependencies в vs? – Summer Sun 19 September 2017 в 01:59
  • 5
    Я не думаю, что вам нужно указать путь для встроенной библиотеки Windows. В наших файлах .pro есть строки, подобные этому в разделе win32: LIBS += -lGdi32. – Dan Korn 2 April 2018 в 16:45

Если вы хотите развернуть свое приложение на компьютерах клиентов, а не использовать свое приложение только самостоятельно, мы обнаружим, что метод 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
}

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

2
ответ дан adlag 21 August 2018 в 16:57
поделиться

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

win32:LIBS += path/to/Psapi.lib
22
ответ дан Daniel Brunner 21 August 2018 в 16:57
поделиться
  • 1
    Извините за хромой вопрос, но должна ли быть создана библиотека psapi или QtCreator позаботится о ее создании? – Dfr 16 July 2013 в 20:06

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

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

11
ответ дан martin 21 August 2018 в 16:57
поделиться
  • 1
    Новейшие версии Qt (Creator) всегда хотят (одиночные) косые черты в качестве разделителя каталогов. Единственное исключение - когда вы используете «систему», команды под Windows. Затем вам нужно пропустить систему с помощью обратной косой черты, то есть двух обратных косых черт. Чтобы заменить все косые черты двумя обратными косыми чертами, можно сделать следующее: WINDIR = $$DIR, WINDIR ~=s,/,\\,g – adlag 19 August 2015 в 20:37

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

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 / Утилиты 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 -lvtkzpat - lvtkNetCDF -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

4
ответ дан QT-ITK-VTK-Help 21 August 2018 в 16:57
поделиться

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

6
ответ дан user 21 August 2018 в 16:57
поделиться

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

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

Как я это сделал:

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

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

1
ответ дан zar 21 August 2018 в 16:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: