a.exe 대신 항상 코드 파일 이름으로 출력하도록 gcc를 구성할 수 있나요?

a.exe 대신 항상 코드 파일 이름으로 출력하도록 gcc를 구성할 수 있나요?

기본적으로 실행 시 gcc test.cgcc는 실행 파일을 a.exe.gcc에서 생성할 수 있도록 전역적으로 재정의하는 방법이 있습니까 test.exe?

이는 입력 파일이 하나만 있다고 가정합니다. 그렇지 않으면 gcc는 a.exe 또는 첫 번째 파일 이름을 사용하도록 선택할 수 있습니다.

답변1

이는 일반적으로 makefile 규칙을 통해 수행됩니다. 예를 들어 test.c, 주어진 경우에도 이를 수행할 수 있습니다.아니요메이크파일이 있습니다):

make test

마찬가지로, g++에는 test2.cc동일한 작업을 수행할 수 있다는 전제 하에 미리 정의된 규칙이 있습니다.

make test2

그러나 두 경우 모두 라이브러리가 필요할 것입니다. 이렇게 하면 makefile의 이점이 있습니다(여러 객체를 컴파일하는 방법을 제공하는 것 외에도).

gcc 자체에는 makefile 규칙을 에뮬레이트하는 옵션이 없습니다. 이를 수행할 수 있는 도구를 원한다면 언급된 특별한 경우를 수행하는 쉘 스크립트를 만들 수 있습니다.

#!/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 파일의 이름을 사용하도록 하는 방법을 찾을 수 없습니다. 그러나 gcc 대신 실행하도록 만든 빠른 bash 스크립트는 다음과 같습니다.

#!/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

관련 정보