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

Don*_*alo 106 c++ winapi qt qt-creator

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

小智 211

正确的方法是这样的:

LIBS += -L/path/to -lpsapi
Run Code Online (Sandbox Code Playgroud)

这样它就可以在Qt支持的所有平台上运行.这个想法是你必须将目录与库名分开(没有扩展名,没有任何'lib'前缀).当然,如果你包含一个Windows特定的lib,这真的没关系.

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

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
Run Code Online (Sandbox Code Playgroud)

  • 这是这篇文章的正确答案. (7认同)
  • +1因为它考虑跨平台解决方案,最完整的答案. (4认同)
  • 是否可以将环境变量指定为库路径?我问,因为如果项目是由多个人开发的,那么将硬编码的路径名写入.pro文件会破坏一些项目,这些人可能没有在同一位置安装所有库. (2认同)

dir*_*tly 22

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

win32:LIBS += path/to/Psapi.lib
Run Code Online (Sandbox Code Playgroud)


小智 11

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

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


小智 6

您的意思是错过了额外的包含路径.尝试添加它:INCLUDEPATH + = C:\ path\to\include\files \希望它有效.问候.


QT-*_*elp 6

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

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 -lvtkex ollc-lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering


adl*_*lag 6

如果您想将应用程序部署在客户的计算机上,而不是仅自己使用您的应用程序,我们发现该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
}
Run Code Online (Sandbox Code Playgroud)

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