gpt4 book ai didi

qt - 在 Qt 中获取编译器可执行文件的路径

转载 作者:行者123 更新时间:2023-12-04 18:28:45 25 4
gpt4 key购买 nike

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

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

更新

恐怕我没有把自己说清楚。

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

问题是这个 copy命令仍然需要知道从哪里复制 MinGW 库。因此我的问题是:编译时如何知道编译器路径 ?
$$OUT_PWD在 Qt *.pro 文件中扩展为构建应用程序所在目录的路径。 $$PWD展开到项目目录。是否有类似的宏(或者可能是 hack)提供编译器可执行文件的路径?

最佳答案

你试图从错误的角度解决问题。特别是,您想要的解决方案不会很健壮。它仍然会在不同的系统上中断,例如,安装了不同版本的 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。
  • 关于qt - 在 Qt 中获取编译器可执行文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20491064/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com