将外部库添加到Qt Creator项目中


112

如何将外部库添加到Qt Creator RC1(版本0.9.2)构建的项目中?例如,EnumProcesses()需要Psapi.lib在项目中添加win32函数以进行构建。

Answers:


216

正确的方法是这样的:

LIBS += -L/path/to -lpsapi

这样,它将在Qt支持的所有平台上运行。这个想法是您必须将目录与库名分开(不带扩展名,并且不带任何“ lib”前缀)。当然,如果要包含Windows特定的库,那真的没关系。

如果要将lib文件存储在项目目录中,则可以使用$$_PRO_FILE_PWD_变量引用它们,例如:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

2
是否可以将环境变量指定为库路径?我问是因为如果一个项目是由可能没有将所有库都安装在同一位置的多个人开发的,则将硬编码的路径名写入.pro文件会破坏事情。
antant

这确实对我有用,但是当我使用生成一个vs项目时qmake -tp vc,在Additional Dependencies该项目中没有库名称,但是vs项目运行得很好。这是否意味着还有其他方法可以添加Additional Dependenciesvs?
夏季太阳

1
我认为您不需要为内置Windows库指定路径。我们的.pro文件必须在Win32节这样行:LIBS += -lGdi32
丹·科恩

1
正如@DanKorn指出的那样,对于内置Windows库,您不需要(也不应该)指定路径。
Bur

他们为什么不制作GUI添加库smh。
GeneCode

24

您正在使用qmake项目吗?如果是这样,您可以使用该LIBS变量添加一个外部库。例如:

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

1
对不起,我很抱歉,但是应该已经预先构建了psapi库,还是QtCreator将负责构建它?
Dfr

11

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

无法使用,因为您在程序文件中使用空格。在这种情况下,您必须添加引号,因此结果将如下所示:LIBS + =“ C:\ Program Files \ OpenCV \ lib”。我建议将库放在非空白位置;-)


最新版本的Qt(Creator)始终希望(单个)正斜杠作为目录分隔符。唯一的例外是在Windows下使用“系统”命令时。然后,您需要向系统提供一个转义的反斜杠,即两个反斜杠。要用两个反斜杠替换所有正斜杠,可以按照以下步骤进行:WINDIR = $$DIRWINDIR ~=s,/,\\,g
adlag 2015年

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 / 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 -lvtktlvtktlvtlvtktlvtktlvtlvtktlvtktlvtlvtktlvtlvtktlvtlvtktlvtlvtktlvtktlvtlvtktlvtlvtktlvtktlvtlvtklvktlvtlvtktlvtlvtktlvtlvtktlvtlvtktlvtlvtktlvtlvtktlvtklvktlvtklvktlvtklvktlvtklvktlvtklvk -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


3

如果您想在客户的机器上部署应用程序,而不是仅自己使用应用程序,我们发现该LIBS+= -Lxxx -lyyy方法即使没有问题也可能导致混乱。

我们使用Qt开发适用于Linux,Mac和Windows的应用程序。我们提供完整的独立应用程序。因此,所有非系统库都应包含在部署包中。我们希望我们的客户能够为所有操作系统从同一USB记忆棒运行该应用程序。为了平台兼容性,必须将USB记忆棒格式化为FAT32,它不支持(Linux)符号链接。

我们发现这个LIBS+= -Lxxx -lyyy成语太黑了:

  1. 我们不完全知道链接程序已找到的(静态或动态)库的文件路径。这很不方便。我们的Mac链接程序经常发现与我们认为应该使用的库不同的库。这在OpenSSL库中发生了多次,Mac链接程序在其中找到并使用了自己的(较旧的,不兼容的)OpenSSL版本,而不是我们要求的版本。

  2. 我们不能保证链接器使用符号链接到库,因为这会破坏部署包。

  3. 我们想从库的名称中看到是链接静态库还是动态库。

因此,对于我们的特殊情况,我们仅使用绝对文件路径并检查它们是否存在。我们删除所有符号链接。

首先,我们找出正在使用的操作系统,并将其放入CONFIG变量中。并且,例如对于Linux 64位,则:

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

为了完整起见,我想补充一点,您也可以只添加LIBRARY PATH,在其中它将查找依赖库(它可能不会在代码中直接引用,但是您使用的库可能需要它)。

为了进行比较,这将与LIBPATH环境所执行的操作相对应,但是在Qt Creator中它是晦涩的,并且没有得到很好的记录。

我解决这个问题的方法如下:

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

本质上,如果您不提供实际的库名称,它将在该路径中搜索依赖库。语法上的差异很小,但这对于仅提供用于查找依赖库的PATH很有用。有时只是为每个路径提供单独的库是很痛苦的,您知道它们都位于特定的文件夹中,并且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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.