【问题标题】:G++ makefile command with QProcess带有 QProcess 的 G++ makefile 命令
【发布时间】:2017-01-17 12:33:11
【问题描述】:

我正在尝试使用 g++ 编译器生成一个 .exe 文件。我尝试了多种方法都没有成功。

1) QString program = "C:/Strawberry/c/bin/g++";
QStringList arguments;
arguments << "g++ -o dialog C:/Documents/ED30/dialog.cpp";
QProcess process;
process.start(program, arguments);
process.waitForFinished(-1);

2) QProcess::execute("g++ -o dialog2 C:/Documents/ED30/dialog.cpp");

3) QProcess::execute("g++ C:/Documents/ED30/dialog.cpp -o dialog2"); 

每次我都有相同的错误信息:

“在 C:/Documents/ED30/dialog.cpp:1:0 中包含的文件中: C:/Documents/ED30/dialog.h:4:19:致命错误:QDialog:没有这样的文件或目录 编译终止。”

或者有时什么也没发生。

我在 Windows 8.1 上使用带有 MinGW 的 Qt 5.7

编辑: 所以在和成员讨论了这个问题之后,我做了一些进展。 迄今为止最好的代码是:

system("g++ -o dialog2 -I C:/Qt/5.8/mingw53_32/include -I C:/Qt/5.8/mingw53_32/include/QtGui -I C:/Qt/5.8/mingw53_32/include/QtCore -I C:/Qt/5.8/mingw53_32/include/QtWidgets -L C:/Qt/5.8/mingw53_32/lib C:/Documents/ED30/dialog.cpp");

但这表明 MinGW 不是 c++ 11 编译器,它建议我在命令行中编写“-std=c++11 或 -std=gnu++11”以更新编译器.在编译器中输入后,出现如下错误:“Unknow command”。 我尝试使用 Qt 5.7 和 5.8 没有成功。 有解决方案吗?

【问题讨论】:

  • 你在交叉编译C和C++吗?如果没有,请不要发送垃圾标签。
  • error: QDialog: No such file 表示没有这样的文件QDialog
  • 编译器找不到 Qt 头文件。尝试先在命令行上完成这项工作。
  • @StoryTeller:即使他的项目中有C和C++源文件,这也是关于C++的。同意不发送垃圾邮件标签。删除了不相关的语言。
  • @filmor 我试过 :QProcess::execute("g++ -o dialog2 C:/Documents/ED30/dialog.cpp C:/Documents/ED30/dialog.h");它为我创建了一个 dialog.gch 文件。

标签: c++ qt makefile qt5


【解决方案1】:

您尝试编译的代码dialog.cpp 似乎使用了 Qt(尤其是 QDialog)。

当你运行g++ -o dialog2 C:/Documents/ED30/dialog.cpp 时,g++ 会失败,因为它找不到 Qt 头文件和库文件的位置。

使其工作的最小命令行是:

g++ -o dialog2 -I<PathToQtheaders> -L<PathToQtLibraries> -lQt5Core -lQt5Gui -lQt5Widgets C:/Documents/ED30/dialog.cpp

您可能需要根据您的代码需要添加一些额外的库。请注意,如果您只是这样编译它(不调用 moc 等),则不能使用 Q_OBJECT 宏。

提示:在标准 Qt 项目中查看qmake 生成的命令。

额外提示:您可以使用QLibraryInfo::location() 获取Qt 安装路径。

你的第一个例子应该是:

QString program = "C:/Strawberry/c/bin/g++";
QStringList arguments;
arguments << "-o" << "dialog" << "C:/Documents/ED30/dialog.cpp";
QProcess process = "g++";
process.start(program, arguments);
process.waitForFinished(-1);

【讨论】:

  • 似乎他的第一个例子应该是helloworld.cpp,通过cmd.exe手工编译,然后由QProcess编译
  • 您好,谢谢您的回答。所以我尝试了这个: QProcess::execute ("g++ -o dialog2 -I C:/Qt/5.8/mingw53_32/include -L C:/Qt/5.8/mingw53_32/lib C:/Documents/ED30/dialog.cpp");但它仍然向我显示:在 C:/Users/SM/Documents/ED30/dialog.cpp:1:0: C:/Users/SM/Documents/ED30/dialog.h:4:19 中包含的文件中:致命错误:QDialog:没有这样的文件或目录编译终止。
  • 添加-I C:/Qt/5.8/mingw53_32/include/QtWidgets 那是QDialog 所在的位置。你可能需要对 QtGui 和 QtCore 做同样的事情。
  • @BenjaminT:这次我得到了这个:“这个文件需要编译器和库支持 ISO C++ 2011 标准。这个支持目前是实验性的,必须通过 -std=c++ 启用11 或 -std=gnu++11 编译器选项。”
  • @AlikA Qt 5.8 需要 C++11 支持,默认情况下您使用的 mingw 版本未启用该支持。解决方案在消息中:将-std=c++11-std=gnu++11 添加到命令行。正如我在答案中所说,看看你使用 Qt Creator(或 qmake)构建 Qt 项目时执行的命令,你需要的所有命令行选项都在那里。
【解决方案2】:

我认为您缺少 Qt 标头的包含目录。

QProcess::execute("g++ -o dialog -I C:\QtDir C:/Documents/ED30/dialog.cpp");

QtDir 是系统上 Qt 标头的实际位置,例如 C:\Qt\include

您也可能在链接时遇到问题。整个命令是:

QProcess::execute("g++ -o dialog -I C:\QtDir\include -L C:\Qtdir\lib -l Qt C:/Documents/ED30/dialog.cpp")

【讨论】:

  • 像这样:QProcess::execute("g++ -o dialog2 C:/Documents/ED30/dialog.cpp -l"); ?
  • 您应该为您的答案提供更多背景信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
相关资源
最近更新 更多