检查g ++

时间:2016-08-22 15:27:21

标签: linux bash shell gcc

我已阅读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中的某个人说"可悲的是,事实证明,返回0天气不会失败。"当g++失败时,它是否总是会返回非零值?也许我会错过一些明显的东西,所以请为我澄清一下。非常感谢你!

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

2 个答案:

答案 0 :(得分:3)

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
}

答案 1 :(得分:0)

如果cmd成功,则

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