【问题标题】:sh file to compile cpp functions on Mobaxterm with windows machine使用 Windows 机器在 Mobaxterm 上编译 cpp 函数的 sh 文件
【发布时间】:2020-07-14 09:28:30
【问题描述】:

请帮忙!

我需要在 Windows 机器上运行一个调用 Mobaxterm 上 cpp 函数的 sh 文件,我是 shell 脚本的新手,我无法理解以下错误消息:

Creating rtlib.a...
ar: unknown option -- u
BusyBox v1.22.1 (2015-11-10 11:07:12    ) multi-call binary.

Usage: ar [-o] [-v] [-p] [-t] [-x] ARCHIVE FILES

Extract or list FILES from an ar archive

        -o      Preserve original dates
        -p      Extract to stdout
        -t      List
        -x      Extract
        -v      Verbose

Makefile:55: recipe for target 'rtlib.a' failed
make: *** [rtlib.a] Error 1

这里是完整的 sh 代码

#!/bin/bash

# Directories
DIRRTRo=RTRo
DIRrtlib=rtlib
DIRPPPTOOLS=$(pwd)

# Options
CC=g++
CFLAGS="-O3 -lm -lpthread -lrt -static"

# rtlib generation
generatertlib()
{
  echo "*****************"
  echo "rtlib generation"
  echo "*****************"
  cd $DIRrtlib || exit ; make ; cd - || exit
  #cd $DIRrtlib ; make ; cd -
}

# RTRo generation
generateRTRo()
{
  echo "******************"  
  echo "RTRo generation"
  echo "******************"
  cd $DIRRTRo ; make ; cd -
}

# getStream generation
generateGetStream()
{
  echo "********************"
  echo "getStream generation"
  echo "********************"
  $CC getStream.cpp -I$DIRrtlib $DIRrtlib/rtlib.a $CFLAGS -o getStream
}

# processStream generation
generateProcessStream()
{
  echo "************************"
  echo "processStream generation"
  echo "************************"
# Pour la livraison
 $CC processStream.cpp -I$DIRrtlib -I$DIRRTRo $DIRRTRo/libRTRo.a $DIRrtlib/rtlib.a $CFLAGS -DENAGLO -DENAGAL -DENACMP -DNFREQ=4 -DNEXOBS=1 -o processStream

}

# generateLowLevel generation
generateLowLevel()
{
  echo "***************************"
  echo "generateLowLevel generation"
  echo "***************************"
 $CC generateLowLevel.cpp -I$DIRrtlib $DIRrtlib/rtlib.a $CFLAGS -DENAGLO -DENAGAL -DENACMP -DNFREQ=4 -DNEXOBS=1 -o generateLowLevel
}

# processLowLevel generation
generateProcessLowLevel()
{
  echo "**************************"
  echo "processLowLevel generation"
  echo "**************************" 
 $CC processLowLevel.cpp -I$DIRRTRo $DIRRTRo/libRTRo.a $CFLAGS -o processLowLevel
}

# generation of all libraries, getStream and processStream
generateAll()
{
  generatertlib
  generateRTRo
  generateGetStream
  generateProcessStream
  generateLowLevel
  generateProcessLowLevel
}

# Main program

# Too many options
if [ $# -gt 1 ] ; then   
  echo "Error ! Usage : compile.sh [ clean | getStream | processStream | generateLowLevel | processLowLevel | computeErrors | sendStream | all ]"
  echo "Examples :"
  echo "  ./compile.sh"
  echo "  ./compile.sh clean"
  exit
fi

# Read option
if [ $# -eq 1 ] ; then
  if [ $1 == "clean" ] ; then
    cd $DIRrtlib ; make clean ; cd $DIRPPPTOOLS ;
    cd $DIRRTRo ; make clean ; cd $DIRPPPTOOLS ;
    rm -f processStream getStream processLowLevel computeErrors sendStream generateLowLevel
  elif [ $1 == "processStream" ] ; then
    generatertlib
    generateRTRo
    generateProcessStream
  elif [ $1 == "getStream" ] ; then
    generatertlib
    generateGetStream
  elif [ $1 == "generateLowLevel" ] ; then
    generatertlib
    generateLowLevel
  elif [ $1 == "processLowLevel" ] ; then
    generateRTRo
    generateProcessLowLevel
  elif [ $1 == "computeErrors" ] ; then
    generatertlib
    generateComputeErrors
    elif [ $1 == "sendStream" ] ; then
    generatertlib
    generateSendStream
  elif [ $1 == "all" ] ; then
    generateAll
  else
    # Bad option
    echo "Error ! Usage : compile.sh [ clean | getStream | processStream | processLowLevel | generateLowLevel | computeErrors | sendStream | all ]"
    echo "Examples :"
    echo "  ./compile.sh"
    echo "  ./compile.sh clean"
    exit
  fi
fi

# No option => all
if [ $# -eq 0 ] ; then
    generateAll
fi

很抱歉粘贴了这么长的代码,但我确实遇到了问题并且无法理解。 因此,我们将不胜感激!

【问题讨论】:

  • 从终端调用cpp函数是什么意思?您只能从包含该函数的 C++ 程序中调用 C++ 函数。
  • 感谢您有时间回复,我的意思是sh文件会调用同一目录下的一个cpp函数如 generateGetStream() , generateRTRo(), generatertlib()
  • 但是您不能从 shell 脚本调用 C++ 函数!
  • 我真的不知道,但是作为学生提供给我的软件包,包含sh和cpp文件。实际上 sh 文件调用 cpp 文件,我认为它适用于其他人!

标签: shell sh mingw mobaxterm


【解决方案1】:

子目录rtlib 中的makefile 使用规则(显式或隐式)使用ar 命令选项u 生成rtlib.a,BusyBox ar 不知道。解决方法:使用另一个 shell 和成熟的工具链。 (您可以使用 MobaXterm 包管理器工具安装流行的 Cygwin 工具链。)

【讨论】:

  • 谢谢你的回复,我提到我是这种编码的新手,你会一步一步解释,逐字逐句有一个清晰的视野吗?
  • 我确实安装了 Cygwin 工具链 (64),但是在运行时我得到了同样的错误信息!请问还有什么建议吗?
  • 现在的问题是:为什么使用 BusyBox 而不是其他 shell? - 我会卸载“busybox”包(并打开一个新的终端选项卡)。
  • 你能详细解释一下吗,一步一步?
  • 在 MobaXterm 窗口中(至少在我的窗口中)有一个带有宏、工具、会话选项卡的侧边栏。单击工具。现在有一个包含终端游戏、系统、办公室、网络部分的菜单。在 System 下,有 MobApt 包管理器;点击那里。片刻之后,会出现一个包含软件包列表的窗口。选择busybox和busybox-standalone;点击卸载。
猜你喜欢
  • 2016-05-25
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2022-06-18
相关资源
最近更新 更多