【问题标题】:Check return value of g++检查 g++ 的返回值
【发布时间】:2016-12-29 05:36:03
【问题描述】:

我已阅读this,其中建议进行以下编译检查:

installCheck () {
  if g++ check_opencv.cpp -o check_opencv; then
    return 1
  else
    rm check_opencv
    return 0
  fi
}

if installCheck $0; then
  echo "OpenCV already installed, skipping"
  exit 0
fi

但是,运行此脚本会给出:

check_opencv.cpp:2:33: fatal error: opencv2/core/core.hpp: No such file or directory
compilation terminated.
rm: check_opencv: No such file or directory
OpenCV already installed, skipping

这是错误的。然后我改成这样:

installCheck () {
  g++ check_opencv.cpp -o check_opencv
  if [[ $? -ne 0 ]]; then

而且效果很好:

check_opencv.cpp:2:33: fatal error: opencv2/core/core.hpp: No such file or directory
compilation terminated.
Cloning into 'opencv-2.4.9'...

这是为什么呢?因为[[g++ 的某些行为?

this 中的某人说“遗憾的是,make 返回 0 天气或不失败。” g++ 在失败时不应该总是返回非零值吗?也许我错过了一些明显的东西,所以请为我澄清一下。非常感谢!

更新:事实证明我对 bash 的理解是错误的。返回值 0 在 bash 中计算为 true,这与我之前的想法相矛盾。 This 有帮助。

【问题讨论】:

    标签: linux bash shell gcc


    【解决方案1】:
    if g++ check_opencv.cpp -o check_opencv; then
      return 1
    

    如果编译成功,将返回失败 (1)。显然,如果编译失败,您想返回失败,这将是:

    if ! g++ check_opencv.cpp -o check_opencv; then
      return 1
    

    或者你可以把真假分支按正确的顺序排列:

    installCheck () {
      if g++ check_opencv.cpp -o check_opencv; then
        rm check_opencv
        return 0
      else
        return 1
      fi
    }
    

    我在链接的问题中没有看到它建议您提出的代码的任何地方。

    我想您的目的是避免在编译成功时污染文件系统,因为编译本身是唯一需要的测试。您也可以通过以下方式实现:

    installCheck () {
      g++ check_opencv.cpp -o check_opencv
      local rv=$?
      rm -f check_opencv
      return rv
    }
    

    【讨论】:

    • “if [[ !$(g++ check_opencv.cpp -o check_opencv) ]]; then”和“if !g++ check_opencv.cpp -o check_opencv; then”有什么区别?当已经安装了 opencv 时,后一个不起作用。谢谢!
    • @YunshengBai:它们是完全不同的东西。第一个意义不大:如果g++ 命令没有向stdout 打印任何内容,则它成功(这是正常的,因为g++ 通常会向stderr 打印错误)。第二个测试g++ 是否返回失败代码。您需要更清楚“后一个不起作用”的意思。
    • 谢谢!我对 bash 编程完全陌生,我会学习它。
    【解决方案2】:

    如果 cmd 成功,即 cmd 的退出状态为 0,if cmd; ... 为 "true" - 它在逻辑上等同于 cmd; if [[ $? -eq 0 ]]; ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2012-02-04
      • 2016-08-27
      相关资源
      最近更新 更多