【问题标题】:Adding external library into Qt Creator project将外部库添加到 Qt Creator 项目中
【发布时间】:2018-05-02 05:33:39
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi qt qt-creator


    【解决方案1】:

    正确的做法是这样的:

    LIBS += -L/path/to -lpsapi
    

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

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

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

    【讨论】:

    • 是否可以指定环境变量作为库路径?我之所以问,是因为如果一个项目是由多个可能没有将所有库安装在同一位置的人开发的,将硬编码的路径名写入 .pro 文件会破坏事情。
    • 这确实对我有用,但是当我使用 qmake -tp vc 生成一个 vs 项目时,我在项目的 Additional Dependencies 中找不到库名称,但 vs 项目运行良好。这是否意味着还有其他一些方法可以在 vs 中添加Additional Dependencies
    • 我认为您不需要为内置 Windows 库指定路径。我们的 .pro 文件在 win32 部分有这样的行:LIBS += -lGdi32
    • 正如@DanKorn 所说,对于内置的 Windows 库,您不需要(也不应该)指定路径。
    • 他们为什么不能只做一个GUI来添加一个库smh。
    【解决方案2】:

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

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

    【讨论】:

    • 对不起,蹩脚的问题,但是 psapi 库是否应该已经预构建或者 QtCreator 会负责构建它?
    【解决方案3】:

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

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

    【讨论】:

    • 最新版本的 Qt (Creator) 总是需要(单个)正斜杠作为目录分隔符。唯一的例外是当您在 Windows 下使用“系统”命令时。然后你需要给系统一个转义的反斜杠,也就是说两个反斜杠。用两个反斜杠替换所有正斜杠可以如下完成:WINDIR = $$DIRWINDIR ~=s,/,\\,g
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      INCLUDEPATH *= E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/过滤 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 -lvtkexoIIc -lvtkftgl -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTK

      【讨论】:

        【解决方案6】:

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

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

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

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

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

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

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

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

        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
        }
        

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

        【讨论】:

          【解决方案7】:

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

          为了比较,这将对应于 LIBPATH 环境所做的,但它在 Qt Creator 中有点晦涩,并且没有很好的文档记录。

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

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

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-17
              • 1970-01-01
              • 2012-02-02
              相关资源
              最近更新 更多