我用C++/Qt编写应用程序,有时我必须在Windows中编译它们。为此,我使用MinGW。不幸的是,这使得可执行文件依赖于mingwm10.dll
和libgcc_s_dw2-1.dll
。我更喜欢通过将所需的DLL复制到应用程序文件夹并像这样分发它来解决这些问题。我在QMAKE_POST_LINK
文件中使用*.pro来自动化这个过程。
不幸的是,由于各种原因,MinGW在我使用的不同系统上的目录不同。有办法在Qt项目中获得编译器可执行文件的路径吗?MinGW库位于它的exe附近,因此它可以解决这个问题。谢谢。
更新
恐怕我说得不够清楚。
我知道 90%的用户没有Qt,99%的用户没有在他们的桌面上安装MinGW。这个就是为什么我会分发所有需要的DLL以及可执行文件,这样它就可以在任何地方运行,而不需要安装任何东西。我只是将它们复制到与*.exe相同的文件夹中。为了自动化这个复制过程,我向copy
添加了一个QMAKE_POST_LINK
命令,它在链接器完成程序链接之后执行它。
问题是,这个copy
命令仍然需要知道从哪里复制MinGW库。因此,我的问题是:如何知道编译时的编译器路径?
Qt *.pro文件中的*.pro扩展到放置构建应用程序的目录的路径。$$PWD
扩展到项目目录。是否有类似的宏(或可能是黑客)给出编译器可执行文件的路径?
发布于 2013-12-10 10:23:51
你试图从错误的角度来处理这个问题。特别是,您想要的解决方案将是不可靠的。它仍然会在不同的系统上崩溃,例如,安装了不同版本的MinGW工具链的系统,因此不同的运行时DLL,如果由应用程序加载(使用另一个版本的MinGW构建),则很可能会在运行时造成崩溃和未定义的行为。此外,可能有些系统甚至没有安装MinGW。这些是使用特定版本的工具链构建的应用程序应该与包含的相应的运行时DLL(这就是所谓的可再发行运行时)一起发布的主要原因,这在Windows上是常见的做法,而且没有什么问题。
然而,有更好的方法来解决你的问题。只需静态地将所有MinGW运行时库链接到应用程序中即可。对于应用程序来说,这是一个非常好的实践(对于Unix应用程序来说,这是一个非常糟糕的实践)。为此,将以下内容添加到相应的*.pro
中
QMAKE_LFLAGS_WINDOWS += -static-libgcc -static-libstdc++ -static
注意: Qt库本身也必须使用这些标志构建,也就是说,它们也应该独立于MinGW运行时。如果不是,那么您仍然有一个传递的依赖关系到MinGW运行时,因为您的应用程序链接到的Qt库。
注意: _WINDOWS
后缀将确保您的应用程序仅在Windows中使用这些标志进行链接,而在_WINDOWS
上,由于上述原因,它仍然将动态地链接到运行时(例如,Linux上的glibc.so
)。
在此之后,您的应用程序将不再显式地依赖于任何MinGW运行时DLL,这将解决分发和维护两个难题。
注意:如果您决定从QMake迁移到CMake (推荐的),那么here's如何对CMake进行相同的迁移。
更新
您可以检查QMAKE_CXX
变量,但很可能它不包含g++.exe
的绝对路径。通常是简单的g++
,然后在PATH
中搜索包含它的目录。因此,在本例中,您必须解析PATH
并检查其中的每个目录是否存在g++
。在像QMake这样有限的构建系统中编写是非常糟糕的逻辑。所以,正如我前面所说,你最好有两个选择:
https://stackoverflow.com/questions/20491064
复制相似问题