【问题标题】:Getting path to compiler executable in Qt在 Qt 中获取编译器可执行文件的路径
【发布时间】:2013-12-10 09:50:52
【问题描述】:

我用 C++/Qt 编写应用程序,有时我必须在 Windows 中编译它们。为此,我使用 MinGW。不幸的是,这使得可执行文件依赖于mingwm10.dlllibgcc_s_dw2-1.dll。我更喜欢通过将所需的 DLL 复制到应用程序文件夹并像这样分发它来解决此类问题。我在 *.pro 文件中使用 QMAKE_POST_LINK 来自动化该过程。

不幸的是,由于各种原因,MinGW 最终位于我使用的不同系统上的不同目录中。有没有办法在 Qt 项目中获取编译器可执行文件的路径? MinGW 库位于其 exe 附近,因此可以解决问题。 谢谢。

更新

恐怕我说得不够清楚。

知道 90% 的用户没有 Qt,99% 的 Windows 桌面上没有安装 MinGW。 是我将所有需要的 DLL 与可执行文件一起分发的原因,以便它可以在任何地方运行而无需安装任何东西。我只是将它们复制到与 *.exe 相同的文件夹中。为了自动化这个复制过程,我在QMAKE_POST_LINK 中添加了一个copy 命令,它会在链接器完成链接我的程序后执行它。

问题是这个copy 命令仍然需要知道从哪里复制MinGW 库。因此我的问题是:如何知道编译时的编译器路径

$$OUT_PWDin Qt *.pro 文件扩展为构建应用程序所在目录的路径。 $$PWD 展开到项目目录。是否有类似的宏(或者可能是 hack)提供编译器可执行文件的路径?

【问题讨论】:

    标签: qt gcc dll mingw qmake


    【解决方案1】:

    您试图从错误的角度解决问题。特别是,您想要的解决方案不会很健壮。它仍然会在不同的系统上中断,例如,安装了不同版本的 MinGW 工具链并因此具有不同运行时 DLL 的系统,如果由您的应用程序(使用另一个版本的 MinGW 构建)加载,很可能会导致崩溃和未定义的行为运行。此外,可能有些系统甚至没有安装 MinGW。这就是为什么使用特定版本的工具链构建的应用程序应该与包含相应的运行时 DLL(这就是所谓的 可再发行运行时)一起分发的主要原因,这是 Windows 上的常见做法,没有错用它。

    但是,有更好的方法可以解决您的问题。只需将所有 MinGW 运行时库静态链接到您的应用程序中。对于 Windows 应用程序,这是一种非常的做法(对于 Unix 应用程序来说,这是一种非常的做法)。为此,请将以下内容添加到相应的*.pro

    QMAKE_LFLAGS_WINDOWS += -static-libgcc -static-libstdc++ -static
    

    注意: Qt 库本身也必须使用这些标志构建,即它们也应该独立于 MinGW 运行时。如果不是,那么由于您的应用程序所链接的 Qt 库,您仍然对 MinGW 运行时具有传递依赖。

    注意: _WINDOWS 后缀将确保您的应用程序仅在 Windows 平台上与这些标志链接,而在 Unix 上它仍将与运行时动态链接(例如 Linux 上的 glibc.so ) 出于上述原因。

    之后,您的应用程序将不再显式依赖任何 MinGW 运行时 DLL,这将解决分发和维护方面的难题。

    注意:如果您决定从 QMake 迁移到 CMake(推荐),那么 here's 如何为 CMake 做同样的事情。

    更新


    您可以检查QMAKE_CXX 变量,但很可能它不包含g++.exe 的绝对路径。通常它只是g++,然后在PATH 中搜索包含它的目录。因此,在这种情况下,您必须解析 PATH 并检查其中的每个目录是否存在 g++。在像 QMake 这样有限的构建系统中编写这是非常讨厌的逻辑。所以,正如我上面所说,你最好有两个选择:

    • 将运行时静态链接到应用程序中,这样您就不必分发任何东西。如果您不想这样做,那么我想知道原因 - 请写评论;
    • 迁移到功能更丰富、更灵活的构建系统 - CMake。

    【讨论】:

    • 我已经澄清了我的问题。
    • 更新了,看看吧。
    • 非常感谢您的回答。静态链接是一种非常强大和方便的工具,但不幸的是存在许可证问题。例如,您必须在 GPL 下发布您的代码或为商业 Qt 版本付费。 MinGW 甚至不给你后一种选择,因为它是 GPL-only。我自己是 OSS 的忠实粉丝,我会尽可能地分发我的资源,但我的雇主不同意这种方法,所以是的。我会将您的评论标记为答案,因为它看起来是最接近的解决方案。
    • 我认为您错过了重要的一点。不要以为我建议你静态链接 Qt 库。当然不是,因为那样你就需要为他们购买许可证。您仍然应该与 Qt 动态链接。我的意思是,您最好使用 MinGW 和 -static-libgcc -static-libstdc++ -static 标志从源代码(而不是下载来自官方网站的那个)重建 Qt,这样您将与您的应用程序一起分发的动态 Qt 库不依赖于MinGW 运行时。还可以使用相同的标志构建您自己的应用程序,并且您很干净。
    • 哇,从源代码构建 Qt 听起来像是一项工作。我想我会继续将 MinGW 库复制到应用程序文件夹。再次感谢,你很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2022-11-01
    • 2012-08-20
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多