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

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

238565 次浏览

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

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

The error you mean is due to missing additional include path. 试着加上: INCLUDEPATH + = C: 包含文件的路径 希望有用。 问候。

正确的做法是这样的:

LIBS += -L/path/to -lpsapi

This way it will work on all platforms supported by Qt. The idea is that you have to separate the directory from the library name (without the extension and without any 'lib' prefix). Of course, if you are including a Windows specific lib, this really doesn't matter.

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

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

程序文件 OpenCV lib

won't work because you're using white-spaces in Program Files. In this case you have to add quotes, so the result will look like this: LIBS += "C:\Program Files\OpenCV\lib". 我建议将库放在非空白位置; -)

并添加多个库文件,您可以编写如下:

INCLUDEPATH *= E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Filter E:/DebugLibrary/VTK/GenericFilter E:/DebugLibrary/VTK/Graphics E:/DebugLibrary/VTK/GUISsupport/Qt E:/DebugLibrary/VTK/混合 E:/DebugLibrary/VTK/image E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Parallel E:/DebugLibrary/VTK/渲染 E:/DebugLibrary/VTK/实用程序 E:/DebugLibrary/VTK/Volume渲染 E:/DebugLibrary/VTK/Widgets E:/DebugLibrary/VTK/Wraling

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方法即使没有问题,也会导致混淆。

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

我们发现 LIBS+= -Lxxx -lyyy的习惯用法太像一个黑匣子:

  1. 我们并不确切地知道链接器找到的(静态或动态)库的文件路径是什么。真不方便。我们的 Mac 链接器经常发现库与我们认为应该使用的库不同。这种情况在 OpenSSL 库中发生了好几次,Mac 链接器发现并使用了自己的(旧的、不兼容的) OpenSSL 版本,而不是我们请求的版本。

  2. 我们不能允许链接器使用指向库的符号链接,因为这会破坏部署包。

  3. 我们希望从库的 name中看到我们链接的是静态库还是动态库。

因此,对于我们的特殊情况,我们只使用绝对文件路径并检查它们是否存在。

首先,我们找出我们正在使用的操作系统,并将其放入 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
}

所有依赖项都可以复制到部署包中,因为我们知道它们的文件路径。

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

作为比较,这将对应于 LIBPATH 环境所做的事情,但是它在 Qt Creator 中比较模糊,而且没有很好的文档说明。

The way i came around this is following:

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

实际上,如果不提供实际的库名,它就会添加搜索依赖库的路径。语法上的差异很小,但是这对于提供在哪里查找依赖库的 PATH 非常有用。这只是一个痛苦的时候,提供每个路径个人库,你知道他们都在某个文件夹和 Qt 创建者将拿起它们。

专业: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

在. h/. cpp: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")