繁体   English   中英

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

[英]Adding external library into Qt Creator project

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

正确的做法是这样的:

LIBS += -L/path/to -lpsapi

这样它就可以在 Qt 支持的所有平台上工作。 这个想法是你必须将目录与库名分开(没有扩展名,也没有任何“lib”前缀)。 当然,如果您包含 Windows 特定的库,这真的无关紧要。

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

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

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

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

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

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

您的意思是由于缺少其他包含路径而导致的错误。 尝试添加它: INCLUDEPATH += C:\\path\\to\\include\\files\\ 希望它有效。 问候。

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

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

如果您想在客户的机器上部署您的应用程序,而不是只使用您自己的应用程序,我们发现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
}

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

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

为了进行比较,这与 LIBPATH 环境所做的相对应,但它在 Qt Creator 中有点模糊并且没有很好的文档记录。

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

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

基本上,如果您不提供实际的库名称,它会添加搜索依赖库的位置的路径。 语法上的差异很小,但这对于仅提供 PATH 查找依赖库的位置非常有用。 有时提供每个路径单独的库是一件很痛苦的事情,你知道它们都在某个文件夹中,Qt Creator 会选择它们。

在 .pro 中: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM