Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt curl.exe在调试/发布中工作,但在部署中不工作_C++_Qt_Curl - Fatal编程技术网

C++ Qt curl.exe在调试/发布中工作,但在部署中不工作

C++ Qt curl.exe在调试/发布中工作,但在部署中不工作,c++,qt,curl,C++,Qt,Curl,我想用curl发送电子邮件。我不想使用libcurl,所以我尝试使用.exe文件。以下是我正在使用的代码: QString cmd = "curl smtp://smtp.gmail.com:587 -v --mail-from \"xxxxxxxxxxx@gmail.com\" --mail-rcpt \"xxxxxxxxxxxxxx@gmail.com\" --ssl -u xxxxxxxxxxxx@gmail.com:xxxxxxxxxxxxx-T \"msg.txt\" -k --any

我想用curl发送电子邮件。我不想使用libcurl,所以我尝试使用.exe文件。以下是我正在使用的代码:

QString cmd = "curl smtp://smtp.gmail.com:587 -v --mail-from \"xxxxxxxxxxx@gmail.com\" --mail-rcpt \"xxxxxxxxxxxxxx@gmail.com\" --ssl -u xxxxxxxxxxxx@gmail.com:xxxxxxxxxxxxx-T \"msg.txt\" -k --anyauth & pause";
const char* ccmd = cmd.toStdString().c_str();
system(ccmd);
然而,当我在Qt Creator中使用它时,无论是调试还是发布,它都可以正常工作。(为了测试,我不得不添加
&pause
)在部署它时,它只是说它不能被识别为有效的程序/批处理文件。请注意,它并没有说
curl.exe不可识别
,而是说
$\@$%^不可识别
(某种奇怪的书写方式)。我想这是因为它是编译的

以下是我的部署方式:从发布版>>Qt控制台>>
windeployqt--gui复制.exe。
我还添加了curl.exe、libcurl.dll和一个证书文件。为什么不起作用?谢谢大家

编辑:目录的屏幕截图
问题不在于卷曲。这是你的C++:看一下这行:

 const char* ccmd = cmd.toStdString().c_str();
它有什么作用
cmd.toStdString()
创建一个临时
std::string
对象。使用
c_str()
可以获得指向
std::string
对象内部的指针。在行的末尾,带有
std::string
对象被分发,并且存储的指针指向任何地方(=悬空)。因此,访问此指针是未定义的行为

这种未定义的行为是有罪的,为什么它在您的开发机器上工作,而不是在部署的机器上工作。在您收到的错误消息中可以看到悬空指针:$#@$%@^

如何解决你的问题?简单,只需复制
std::string
对象:

const std::string s = cmd.toStdString();
const char* ccmd = s.c_str();
现在只要
s
存在,
ccmd
就有效。如果这对你来说太多了,你可以把所有的都写在一行里

system(cmd.toStdString().c_str());
该标准保证临时对象在
之前有效即使它在函数调用中


祝你快乐,干杯

如果您使用的是可执行文件目录中的
curl
程序,请尝试使用as
/curl
或确保目录
curl
位于系统bin路径中。@rakib\ux不工作。。。我在windows上。。。你说它在系统箱路径中是什么意思?它和.exe在同一个文件夹中,我将编辑帖子并添加一个dir图片看看如何添加自定义bin路径:@rakib_uu仍然不工作…哇,它工作了!我自己也不会猜到。。。非常感谢!