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

时间:2017-05-27 00:44:49

标签: c++ qt curl

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

var classAsWithEmptyAbc = Delivery
    .SelectMany(x => x.Value.Where(c => string.IsNullOrEmpty(c.abc)))
    .ToList();

然而,当我在Qt Creator中使用它时,无论是调试还是发布,它都能正常工作。 (我必须添加let i = arr.length; let obj = {}; while(i--){ let [year, month, day] = arr[i].Date.split('-'); //probably a better way of initializing a hashtree. if(!obj[year]){ obj[year] = {}; } if(!obj[year][month]){ obj[year][month] = {}} let occur = obj[year][month]['occurences'] let minutes = obj[year][month]['minutes'] obj[year][month]['occurences'] = (occur === undefined) ? 1 : occur + 1; obj[year][month]['minutes'] = (minutes === undefined) ? arr[i].Minutes : arr[i].Minutes + minutes; } 用于测试目的)在部署它时,它只是说它不被识别为有效的程序/批处理文件。请注意,它并不是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); 而是& pause(某种奇怪的写作)。我猜是因为它已经编译了

以下是我的部署方法:从发布版>>复制.exe文件Qt控制台>> curl.exe isn't recognized我还添加了curl.exe,libcurl.dll和证书文件。为什么它不起作用?谢谢大家。

编辑:目录的屏幕截图 Link

1 个答案:

答案 0 :(得分:0)

问题不在于卷曲。这是你的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();

现在ccmd有效,因为s存在很长时间。如果这对你来说太多了,你可以写一行

system(cmd.toStdString().c_str());

该标准保证临时对象的存在直到;,即使它在函数调用中。

快乐的编码和欢呼!