我用C ++ / Qt编写应用程序,有时我必须在Windows中编译它们。为此,我使用MinGW。不幸的是,这使得可执行文件依赖于mingwm10.dll
和libgcc_s_dw2-1.dll
。我更喜欢通过将所需的DLL复制到应用程序文件夹并像这样分发来解决这些问题。我在* .pro文件中使用QMAKE_POST_LINK
来自动执行该过程。
不幸的是,由于各种原因,MinGW在我使用的不同系统上的不同目录中结束。有没有办法在Qt项目中获取编译器可执行文件的路径? MinGW libs靠近它的exe,所以它可以解决问题。 感谢。
更新
我担心自己不够清楚。
我知道,90%的用户没有Qt,99%的用户没有在他们的Windows桌面上安装MinGW。 这是我将所有需要的DLL与可执行文件一起分发的原因,以便它可以在任何地方运行而无需安装任何内容。我只是将它们复制到* .exe的同一个文件夹中。为了自动执行此复制过程,我向copy
添加了QMAKE_POST_LINK
命令,该命令在链接器完成链接程序后执行它。
问题是这个copy
命令仍然需要知道从哪里复制MinGW库。因此我的问题是:如何在编译时知道编译器路径?
$$OUT_PWD
扩展到构建应用程序所在目录的路径。 $$PWD
扩展到项目目录。是否有一个类似的宏(或者可能是一个hack),它给出了编译器可执行文件的路径?
答案 0 :(得分:1)
您正试图从错误的角度处理问题。特别是,您想要的解决方案将不健壮。它仍将在不同的系统上中断,例如,安装了不同版本的MinGW工具链的那些,因此不同的运行时DLL,如果你的应用程序加载(用另一个版本的MinGW构建),很可能会导致崩溃和未定义的行为运行。此外,可能存在甚至没有安装MinGW的系统。这些是使用特定版本的工具链构建的应用程序应该与包含的相应运行时DLL(这就是所谓的可再发行的运行时)一起分发的主要原因,这是Windows上的常见做法,并且没有错用它。
但是,有更好的方法可以解决您的问题。只需将所有MinGW运行时库静态链接到您的应用程序中。对于Windows应用程序来说,这是一个非常好的实践(对于Unix应用程序,这是一个非常糟糕的实践)。为此,请将以下内容添加到相应的*.pro
:
QMAKE_LFLAGS_WINDOWS += -static-libgcc -static-libstdc++ -static
注意: Qt库本身也必须使用这些标志构建,即它们也应该独立于MinGW运行时。如果没有,那么你仍然会对MinGW运行时具有传递依赖性,因为你的应用程序链接了Qt库。
注意: _WINDOWS
后缀将确保您的应用程序仅与Windows平台链接这些标记,而在Unix上它仍将动态链接到运行时(例如{{1因为上面讨论的原因,在Linux上)。
之后,您的应用程序将不再明确依赖任何MinGW运行时DLL,这将解决分发和维护问题。
注意:如果您决定从QMake迁移到CMake(推荐),那么 here's 如何为CMake执行相同操作。
您可以检查glibc.so
变量,但很可能它不包含QMAKE_CXX
的绝对路径。通常它只是g++.exe
,然后在g++
中搜索包含它的目录。因此,在这种情况下,您必须解析PATH
并检查其中的每个目录中是否存在PATH
。在像QMake这样有限的构建系统中编写这是非常讨厌的逻辑。所以,正如我上面所说,你最好选择2个选项: