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

C++ 将外部库添加到Qt Creator项目中,c++,winapi,qt,qt-creator,C++,Winapi,Qt,Qt Creator,如何将外部库添加到Qt Creator RC1(版本0.9.2)构建的项目中?例如,win32函数enumprocess()要求将Psapi.lib添加到要生成的项目中。是否使用qmake项目?如果是这样,可以使用变量添加外部库。例如: win32:LIBS += path/to/Psapi.lib 您所指的错误是由于缺少其他包含路径。 尝试添加以下内容: INCLUDEPATH+=C:\path\to\include\files\ 希望它能起作用。 问候。正确的方法如下: LIBS += -

如何将外部库添加到Qt Creator RC1(版本0.9.2)构建的项目中?例如,win32函数
enumprocess()
要求将
Psapi.lib
添加到要生成的项目中。

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

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

您所指的错误是由于缺少其他包含路径。 尝试添加以下内容: INCLUDEPATH+=C:\path\to\include\files\ 希望它能起作用。
问候。

正确的方法如下:

LIBS += -L/path/to -lpsapi
这样,它将在Qt支持的所有平台上工作。其思想是必须将目录与库名称分开(不带扩展名,也不带任何“lib”前缀)。当然,如果您包含一个特定于Windows的库,这其实并不重要

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

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi
LIBS+=C:\Program Files\OpenCV\lib

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

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

INCLUDEPATH*=E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/过滤E:/DebugLibrary/VTK/通用过滤 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/渲染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-lvtkexpat-LVTKknetcdf-lvtkexoIIc-lvtkftgl-lvtkfreetype-LVTKfrid-LVTKfrid-lvtkVolumeRendering-LQVKwidgetPlugin-lvtkGenericFiltering


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

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

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

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

  • 我们负担不起链接器使用指向库的符号链接,因为这会破坏部署包

  • 我们想从库的名称中查看是链接静态库还是动态库

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

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

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

    为了完整起见,我想添加一个库路径,您也可以只添加该库路径,它将在其中查找依赖库(在代码中可能没有直接引用,但您使用的库可能需要它)

    作为比较,这与LIBPATH环境的功能相对应,但它在Qt Creator中有点模糊,并且没有很好的文档记录

    我处理这件事的方式如下:

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

    基本上,如果您不提供实际的库名称,它将添加搜索依赖库的路径。语法上的差异很小,但这对于提供查找依赖库的路径非常有用。有时候,提供每个路径只是一种痛苦,因为您知道每个库都在某个文件夹中,Qt创建者会把它们取出来。

    in.pro:
    LIBS+=Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

    #pragma comment(lib,"psapi.lib")
    
    在.h/.cpp:
    #pragma注释(lib,“user32.lib”)


    很抱歉提出了一个蹩脚的问题,但psapi库应该已经预构建,还是QtCreator将负责构建它?是否可以将环境变量指定为库路径?我这样问是因为如果一个项目是由多个人开发的,而这些人可能没有将所有库安装在同一个位置,那么将硬编码路径名写入.pro文件将破坏项目。这对我来说确实有效,但当我使用
    qmake-tp vc
    生成vs项目时,我在项目的
    附加依赖项中没有找到libs名称,但是vs项目运行良好。这是否意味着有其他方法可以在vs中添加
    其他依赖项
    ?我认为不需要为内置Windows库指定路径。我们的.pro文件在win32部分有如下行:
    LIBS+=-lGdi32
    。正如@DanKorn所指出的,对于内置Windows库,您不需要(也不应该)指定路径。为什么他们不能只制作一个GUI来添加库smh。最新版本的Qt(Creator)总是希望(单)正斜杠作为目录分隔符。唯一的例外是