首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Qt中获取编译器可执行文件的路径

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

Stack Overflow用户
提问于 2013-12-10 09:50:52
回答 1查看 1.5K关注 0票数 4

我用C++/Qt编写应用程序,有时我必须在Windows中编译它们。为此,我使用MinGW。不幸的是,这使得可执行文件依赖于mingwm10.dlllibgcc_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扩展到项目目录。是否有类似的宏(或可能是黑客)给出编译器可执行文件的路径?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-10 10:23:51

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

然而,有更好的方法来解决你的问题。只需静态地将所有MinGW运行时库链接到应用程序中即可。对于应用程序来说,这是一个非常好的实践(对于Unix应用程序来说,这是一个非常糟糕的实践)。为此,将以下内容添加到相应的*.pro

代码语言:javascript
运行
复制
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这样有限的构建系统中编写是非常糟糕的逻辑。所以,正如我前面所说,你最好有两个选择:

  • 静态地将运行时链接到应用程序中,这样您就不必发布任何内容。如果你不想做,那么我想知道为什么-请写评论;
  • 迁移到更多的功能丰富和灵活的构建系统- CMake。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20491064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档