![在作为输入给出的目录中编译 c/cpp 文件](https://linux22.com/image/114375/%E5%9C%A8%E4%BD%9C%E4%B8%BA%E8%BE%93%E5%85%A5%E7%BB%99%E5%87%BA%E7%9A%84%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%BC%96%E8%AF%91%20c%2Fcpp%20%E6%96%87%E4%BB%B6.png)
我需要编写一个名为编译目录接收目录路径作为命令行参数并编译所有 c/cpp 文件。
例如helloWorld.c
文件将被编译成helloWorld.exe
.
所有编译后的文件将被放置在compiled files
当前库下命名的文件夹中,并且它也应该具有正确的权限。
我或多或少知道所需的命令,但我无法将它们组合在一起
答案1
使用 shell 循环,明确调用 C 编译器:
#!/bin/sh
mkdir -p "compiled files"
for src in "$1"/*.c "$1"/*.cpp; do
case $src in
*.c) compiler=${CC:-cc} ;;
*.cpp) compiler=${CXX:-c++} ;;
esac
command "$compiler" -o "compiled files"/"$( basename "$src" "${src##*.}" )exe" "$src"
done
这将使用shell/环境$CC
变量$CXX
作为编译器,除非它未设置或为空,在这种情况下它将默认使用cc
或c++
取决于源文件的后缀。
使用 shell 循环,使用make
隐式规则:
#!/bin/sh
mkdir -p "compiled files"
for src in "$1"/*.c "$1"/*.cpp; do
make "${src%.*}" && mv "${src%.*}" "compiled files"/"$( basename "$src" "${src##*.}" )exe"
done
这将使用隐式规则来构建可执行文件(这些规则受$CC
、$CXX
等环境变量的影响$CFLAGS
)。成功构建后,可执行文件将被重命名,以满足您.exe
在文件上具有文件名后缀的特定要求。
答案2
像下面这样的东西可能会起作用。
#! /bin/sh
mkdir -p 'compiled files'
for x in "$1"/*.c; do gcc $x -o "compiled files/${x%.c}.exe"; done
for x in "$1"/*.cpp; do g++ $x -o "compiled files/${x%.cpp}.exe"; done