【问题标题】:Qt curl.exe working in debug/release but not in deployQt curl.exe 在调试/发布中工作但不在部署中
【发布时间】:2017-05-27 00:44:49
【问题描述】:

我想使用 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 isn't recognized,而是$#@$%@^# isn't recognized(某种奇怪的写法)。我猜是因为它被编译了

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

编辑: 目录的屏幕截图 Link

【问题讨论】:

  • 如果您正在使用可执行文件目录中的curl 程序,请尝试使用./curl 或确保目录curl 在系统bin 路径中。
  • @rakib_ 不起作用...我在 Windows 上...您说它在系统 bin 路径中是什么意思?它与 .exe 位于同一文件夹中,我将编辑帖子并添加目录图片
  • 看看这里如何添加自定义 bin 路径:technet.microsoft.com/en-us/library/aa997841(v=exchg.65).aspx
  • @rakib_ 仍然不起作用...

标签: c++ qt curl


【解决方案1】:

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

标准保证临时对象在; 之前存在,即使它在函数调用中。

编码愉快,干杯!

【讨论】:

  • 哇,它成功了!我自己也猜不到……非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多