默认情况下,运行时gcc test.c
,gcc 会将可执行文件输出为a.exe
.有没有办法全局覆盖这个以便 gcc 创建test.exe
?
这假设只有一个输入文件 - 否则 gcc 可以选择使用 a.exe,或者可能使用第一个文件的名称。
答案1
这通常是通过 makefile 规则完成的,例如,给定test.c
,你将能够做到这一点(甚至没有有一个 makefile):
make test
同样,g++ 有预定义的规则,给定test2.cc
,你可以做同样的事情:
make test2
但无论哪种情况,您可能都需要库。这样做就是 makefile 的好处(除了提供编译多个对象的方法之外)。
gcc 本身没有模拟 makefile 规则的选项。如果你想要一个可以做到这一点的工具,你可以制作一个 shell 脚本来执行提到的特殊情况,例如,
#!/bin/sh
for name in "$@"
do
case "$name" in
*.c)
gcc -o $(basename "$name") "$name"
;;
*.cc)
g++ -o $(basename "$name") "$name"
;;
*)
echo "ignoring $name, since it is not one of my files!"
;;
esac
done
但是(请参阅答案的开头),脚本只是明确了预定义规则为您提供的功能make
。另一方面,你可以修改脚本以添加必要的库,并在一个地方执行此操作(而不是一组 makefile,这似乎是问题所在)。
顺便说一句:gcc 是否自动提供“.exe”后缀(如果不提供)取决于平台和编译器配置。该后缀在类 Unix 平台上没有用,并且在 Cygwin 等相关平台上通常是可选的。
答案2
我无法找到一种方法让 gcc 创建二进制文件并使用默认编译的 .c 文件的名称。然而,这是我创建的一个快速 bash 脚本,我运行它而不是 gcc:
#!/bin/bash
temp=${1##*/}; output=${temp%.c}
gcc $1 -o $output $2
不相关的是,我扩展了脚本以默认使用名称进行编译,并在文件存在时执行该二进制文件。我确信这可以更好地调整,就像存在具有该名称的文件一样,它将始终运行,但它适合我的目的。
#!/bin/bash
temp=${1##*/}; output=${temp%.c}
gcc $1 -o $output $2
if [ -f $output ]; then
echo "==== $output being run ===="
./$output
fi