查看完整版本: [-- &[讨论]关于调用命令行的一些疑问[execute函数][已解决] --]

QTCN开发网 -> Qt基础编程 -> &[讨论]关于调用命令行的一些疑问[execute函数][已解决] [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

feline 2009-09-06 18:10

&[讨论]关于调用命令行的一些疑问[execute函数][已解决]

有些问题想请教一下各位版主
最近想写一个调用lame命令行的前台,用来对WAV文件进行编码,转换成mp3格式,目前停留在一些细节上,
lame命令行的调用格式基本为 lame [options] <infile> [outfile]
举一个实例 lame -h testcase.wav testcase.mp3
首先,试探性地写了一个命令行
=====================================================
#include <QStringList>
#include <QProcess>
#include <iostream>
using namespace std;

int main ( int argc, char *argv[] )
{
    int return_value;
    QString program_name = "./called/lame";
    char *options = "-h";
    char *infile = "./called/testcase.wav";
    char *outfile = "QT.mp3";
    
    QStringList arguments;
    arguments << options << infile << outfile ;

    return_value = QProcess::execute ( program_name, arguments );
    if ( return_value == 0 )
    {
        cout << "return_value = 0" << endl;
    }
    else
    {
        cout << "return_value = " << return_value << endl;
    }
    
    return 0;
}

=====================================================
此程序可以成功调用lame.exe对*.wav进行编码,但是在以下
return_value = QProcess::execute ( program_name, arguments );
    if ( return_value == 0 )
    {
        cout << "return_value = 0" << endl;
    }
    else
    {
        cout << "return_value = " << return_value << endl;
    }

代码中,我无法取出execute函数所返回的整型值,运行时屏幕上没有任何输出,不知道怎么回事

[讨论]我个人觉得Qt4的文档还是不够详细,在一些函数的返回值和参数上没有太多的说明,仅仅一笔带过,有些东西只能靠自己去总结,不知大家认为呢?

dbzhang800 2009-09-06 18:31
引用楼主feline于2009-09-06 18:10发表的 &[讨论]关于调用命令行的一些疑问[execute函数] :
此程序可以成功调用lame.exe对*.wav进行编码,但是在以下
return_value = QProcess::execute ( program_name, arguments );
    if ( return_value == 0 )
    {
        cout << "return_value = 0" << endl;
    }
    else
    {
        cout << "return_value = " << return_value << endl;
    }
代码中,我无法取出execute函数所返回的整型值,运行时屏幕上没有任何输出,不知道怎么回事
[讨论]我个人觉得Qt4的文档还是不够详细,在一些函数的返回值和参数上没有太多的说明,仅仅一笔带过,有些东西只能靠自己去总结,不知大家认为呢?
.......


你这儿是if else 语句,而且两个分支都有输出语句,也就是说只要执行到该语句,不管return_value是什么,必然会有输出。

没有输出,说明没执行到该语句。

按你所说,你的program_name正常执行了,那么一种可能的就是,你这个进程尚未没有结束

sdh-bing 2009-09-06 21:52
还没用Qt编写过命令行的程序。
不过你确定不输出就代表没执行到那里吗,不知道你的程序是怎么启动的
试一试在if里面加一个messageBox(),哈哈。只是一个建议。

feline 2009-09-07 10:45
引用第1楼dbzhang800于2009-09-06 18:31发表的  :
你这儿是if else 语句,而且两个分支都有输出语句,也就是说只要执行到该语句,不管return_value是什么,必然会有输出。
没有输出,说明没执行到该语句。
.......

今天用gdb调试了一下,execute成功完成,而且也返回了0并赋予return_value ,也运行到了cout << "return_value = 0" << endl;这行,但是就是没有在屏幕上打印出return_value = 0,很是奇怪

dbzhang800 2009-09-07 12:23
这样的话,就和没QProcess 太大关系了。

这样的例子你测试了么?

#include <iostream>
using namespace std;

int main ( int argc, char *argv[] )
{

        cout << "return_value = " << endl;
  
    return 0;
}

feline 2009-09-07 17:06
引用第4楼dbzhang800于2009-09-07 12:23发表的  :
这样的话,就和没QProcess 太大关系了。
这样的例子你测试了么?
#include <iostream>
.......

刚测试过了,我晕倒,确实如你所说,什么都没打印出来,QT难道连标准C++都不支持吗?它想干什么呢,学微软搞垄断,我该怎么办?dbzhang800兄,有何高见,你那边测试结果是什么?

dbzhang800 2009-09-07 17:54
这和Qt应该没什么关系了,无论你用的mingw、GCC、还是msvc,都和Qt关系不大。


怀疑你的方法出问题了

feline 2009-09-08 12:19
引用第6楼dbzhang800于2009-09-07 17:54发表的  :
这和Qt应该没什么关系了,无论你用的mingw、GCC、还是msvc,都和Qt关系不大。
怀疑你的方法出问题了

不对,不对,就这么几行代码
我用G++单独编译你的例子绝对是能够输出
#include <iostream>
using namespace std;

int main ( int argc, char *argv[] )
{

        cout << "return_value = " << endl;
  
    return 0;
}
但是用make命令执行编译脚本就啥也吐不出来了,昨天google了半天,发现可能是Qt确实不支持标准C++的一些东西,这可是很严重的问题,不知怎么解决。版主们也不知道跑到哪里度假去了,没有一个人留言,唉

dbzhang800 2009-09-08 12:50
引用第7楼feline于2009-09-08 12:19发表的  :
但是用make命令执行编译脚本就啥也吐不出来了,昨天google了半天,发现可能是Qt确实不支持标准C++的一些东西,这可是很严重的问题,不知怎么解决。版主们也不知道跑到哪里度假去了,没有一个人留言,唉没有一个人留言,唉


看来你对Qt和C++的关系还不清楚,对make和g++的关系的也不清楚。

现在你编译的程序就是用g++ 直接编译的,和Qt没有任何关系。

另外:Qt只是 C++ 一套库,只是一套库而已,怎么谈得上支不支持标准C++ 的问题,一般都说编译器支不支持标准。
Qt可在msvc、g++等众多的编译器下工作,你怎么会联想到不标准上去呢?

XChinux 2009-09-08 13:01
你是在 Windows下编译的吧?默认的 Qt是加上了core和gui两个库了的,如果这样那么config没有加console也是能编译通过的,但这样就看不到控制台了。
如果你现在在.pro文件中加上 QT -= gui,再看看能编译通过否,应该不行了,必须得加CONFIG += console的。
不管有没有gui库,都可以加CONFIg += console,加上这句后,windows下就能看到标准输出了。

dbzhang800 2009-09-08 13:32
看来只能认为楼主是windows下,且建立的是GUI工程了。

feline 2009-09-09 16:36
引用第9楼XChinux于2009-09-08 13:01发表的  :
你是在 Windows下编译的吧?默认的 Qt是加上了core和gui两个库了的,如果这样那么config没有加console也是能编译通过的,但这样就看不到控制台了。
如果你现在在.pro文件中加上 QT -= gui,再看看能编译通过否,应该不行了,必须得加CONFIG += console的。
不管有没有gui库,都可以加CONFIg += console,加上这句后,windows下就能看到标准输出了。

多谢x版主指点,还有d*800兄参与讨论,问题总算解决了,加上之后确实可以了,哈哈,之前查询过老贴,也许是因为复制的是错误的“CONFIGS += console”,在编译中总是报错。顺便扩展一下这个问题,关于修改*.pro 工程文件的内容我应该查询qmake的相关说明,对吧? CONFIG += console和CONFIg += console两者之间是有区别的对吗?

================输出结果=====================
LAME 3.98.2 32bits (http://www.mp3dev.org/)
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding ./called/testcase.wav to QT.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=2
    Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA
     0/       ( 0%)|    0:00/     :  |    0:00/     :  |         x|     :
00:00--------------------------------------------------------------------------
   kbps      %     %
     0/23     ( 0%)|    0:00/    0:00|    0:00/    0:00|   0.0000x|    0:00
00:00--------------------------------------------------------------------------
   kbps      %     %
    24/24    (100%)|    0:00/    0:00|    0:00/    0:00|   2.1619x|    0:00
-------------------------------------------------------------------------------
   kbps        LR    MS  %     long switch short %
  128.0       70.8  29.2        79.2  12.5   8.3
Writing LAME Tag...done
ReplayGain: -1.6dB
return_value = 0
========================================================

dbzhang800 2009-09-10 09:02
解决就好了,我多说几句,楼主的这个问题,与Qt没关系。进一步说,与c++ 的关系都不大。

因为 windows 的链接时分 windows 和 console 两个子系统。不管是用的c、c++、fortran、还是其他编译型语言,都是在链接时决定哪个子系统的。

比如一个简单的helloworld.cpp程序

以下任何一条命令

  1. g++  helloworld.cpp
    g++  helloworld.cpp -mconsole
    g++ helloworld.cpp -Wl,subsystem,console

生成的都是控制台程序



  1. g++  helloworld.cpp -mwindows
    g++ helloworld.cpp -Wl,subsystem,windows

生成的是gui程序

同样,你用微软的vs系列时cl.exe,同样分这两种情况

  1. cl helloworld.cpp
    cl helloworld.cpp /subsystem:console



  1. cl helloworld.cpp /subsystem:windows


这两个的选择应该是windows下编程的基本功吧,
带界面的程序如果链接 console 子系统,将每次伴随着界面都会弹出一个黑色的控制台窗口
控制台程序如果链接 windows 子系统,由于根本不生成控制台窗口,显然也不存在控制台输出了


至于Qt中 CONFIG中的选项,只不过提供了一个选择哪个子系统的机会。由于Qt是图形界面库,默认告诉链接器链接windows子系统就很正常了。当然,这种问题只在ms windows操作系统存在

feline 2009-09-10 16:30
看来是我才疏学浅了,zhang兄对于编译原理和操作系统还是认识很深刻的阿,又收获了很多有益的知识,如果早一些认识像你们这样的朋友,也不至于走了那么多的弯路了,浪费了那么多的时间。可惜,太晚了,几个月过去了,现在想找份Linux c/c++方面的开发工作实在是太难了,上次去应聘一家刚开张的小公司,他们问我会不会Linux内核裁减,我强忍住了准备塞他一句:“如果我会内核裁减,干嘛还来这里”。有些公司甚至只会用微软的技术(.net\C#), 现在的公司太过现实,让人没有一丝的幻想与机会。目前打算投奔我一个朋友,去他学校看看能不能做个网管,对于未来很迷茫,很悲观,这个时代已经不像我们父母生活的那个年代,一辈子能呆在一个地方工作,这既是一种幸福,也是一种不幸。实在不想放弃Qt的学习,不过干活以后肯定没有这么多时间来专注地学习了,和来论坛提问了,希望曾经帮助过我的朋友一如既往地支持我,保重。

cofei 2011-01-10 09:05
MARK

wjz2047 2015-05-15 18:01
受教了


查看完整版本: [-- &[讨论]关于调用命令行的一些疑问[execute函数][已解决] --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled