2014-11-09 2 views
1

배경 : 원래 C가 DOS 5에서 Turbo-C를 사용하여 1990 년에 배웠습니다. Turbo-C가 표준으로 취급 한 것은 분명히 없었습니다 (그 당시에도).gcc의 기본값으로 -lm을 설정하는 방법이 있습니까?

이제 "88 C 프로그램"을 통해 자신을 새로 고칩니다. 나는 gcc에서 sqrt(), log10() 등과 같이 math.h의 함수를 사용해야 할 때 gcc 명령의 끝에 -lm을 추가하여 수학 라이브러리를 수동으로 연결해야한다는 것을 발견했다. . 이 작업을 자동화하는 방법이 있습니까 (예 : 환경 변수). #include "math.h"를 사용하면 자동으로 -lm을 컴파일 명령에 추가하고 입력 할 필요가 없습니다. 그것? 쿼드 코어 CPU를 사용하는 단일 사용자로서 성능 차이가 크게 걱정되지 않습니다.

잠재적 인 의미 : 쿠분투 14.04에서 우분투 저장소에있는 gcc와 그 의존성 버전을 사용하고 있습니다.

+2

사용 아마도 수 있도록,

(예 : GNU grep 인식 $GREP_OPTIONS GCC가되지는 않습니다.. 일부 명령은 암시 적으로 명령 줄 옵션을 추가 환경 변수를 인식)? – HuStmpHrrr

+1

심각하게,이 4 가지 추가 키 입력 만 입력하면됩니다. 또는'make '또는 다른 빌드 도구를 사용하는 법을 배우고 더욱 생산적으로 배우십시오. – Mat

답변

2

bash (또는 다른 Bourne 파생 쉘)를 사용하는 경우 쉘 기능을 정의 할 수 있습니다. -lm 인수가 수학 라이브러리에 따라 소스 또는 오브젝트 파일의 이름을 따라 해야하기 때문에 별칭이 일을 할 수 없습니다

gccm() { gcc "[email protected]" -lm; } 

예를 들면 다음과 같습니다. (-lm 인수는 각 파일에 대한 확인되지 않은 참조를 추적하는 링커에 전달되며, 해결되지 않은 참조는 이후 인수로 해결할 수 있습니다.)

(CSH 별명은 좀 더 강력한 bash는 별칭을보다 -하지만 CSH는 쉘 기능이없는)이 기능은 다른 명령 이름을 사용하도록 요구하는

주.. 당신이 gcc을 입력합니다하고 추가 인수로 gcc 명령을 호출하는 경우, 당신은 함수가 자신을 호출하는 것을 피하기 위해 약간의 추가 작업을 수행해야합니다

gcc() { command gcc "[email protected]" -lm; } 

나 :

gcc() { /usr/bin/gcc "[email protected]" -lm; } 

command은 동일한 이름의 쉘 기능을 우회하여 지정된 명령을 호출하는 bash 내장입니다. 또는 전체 경로를 gcc으로 지정할 수 있습니다.

이와 같은 함수를 작성하면 더 많은 기본 인수를 추가 할 수 있습니다. gcc의 기본 모드는 다소 느리며 언어의 "gnu90"언어 (GNU 전용 확장이있는 C90)를 지원합니다. 당신은 언어의 더 현대적인 버전을 인식하고 더 수행하기 위해 추가 인수를 지정할 수 있습니다 컴파일 시간 검사 :

gcc() { command gcc -std=c99 -pedantic -Wall -Wextra "[email protected]" -lm; } 

또 다른 대안은 래퍼 스크립트를 작성하고 $PATH에 앞서 /usr/bin의 디렉토리에 넣어하는 것입니다 예 : $HOME/bin.

+0

쉘 기능을 만드는 방법에 대해 더 자세히 알아야 할 필요가 있습니다. 나는 bash를 사용하고 있는데이 파일을 쉘 스크립트와 같은 파일에 넣으려고 시도했지만 감지 할 수있는 것은 아무것도하지 않습니다 (오류 메시지는 없지만 출력 파일은 없습니다). 더 많은 연구 ... –

+0

@ ZeissIkon : 그 라인을 타이핑하면 함수가 생성됩니다; 그것을 호출하지 않습니다. '.bashrc'에 줄을 추가 할 수 있습니다; 이후에이 기능은 차후의 쉘에서 사용할 수 있습니다. (현재 쉘 프로세스에는 영향을 미치지 않습니다.) –

+0

Ah. 그 변경을 할 때 열려있는 모든 셸을 닫아야하므로 .bashrc를 다시 읽을 수 있습니다. 나는 나중에 그것을 시도 할 것이다. 그러나 나는 파이썬 일이 진행되도록 만들었다. 내가 거기에있는 파일이 거기에 없다는 불평을 그만 둘 때 여기에 게시 할 것입니다. –

2

gnu make 스크립트를 작성하시는 것이 좋습니다.

makefile라는 이름의 파일에 다음 스크립트를 넣어 :

LDFLAGS+=-lm 

all:$elf 

$elf:%.o 

%.o:%.c 

clean: 
    rm -rf $elf *.o 

다음 컴파일 할 때 입력 make 또는 make all.

특히, $elf 저장 당신이 그것을 당신의 실행 파일을 호출 대체 할 이름 또는 앞까지없는 공간

elf=name 

.


BTW이 메이크 을 악용 될 수있다. 그것은 시간을 절약하지만 제발 단지 작은 테스트를 원하지 않는 한을 사용하지 마십시오. 당신은

elf=name1 name2 name3 

정도, 한 줄에 여러 ELF 파일을 생성 할 수 있습니다. 그러나이 경우 링커는 모든 .o 파일을 함께 연결하려고 시도 할 것이므로 오류 메시지가 이해하기 어려울 수 있습니다. 하지만 어쨌든, 당신은 단지 작은 테스트 케이스를 원한다고들합니다 ...

+0

그것은 LDFLAGS가 아니라 LDFLAGS입니다. 그리고 저는'$ elf'라는 이름을 사용하지 않을 것입니다; 그것은 객체 파일이 ELF 형식으로되어 있다는 것을 의미합니다. 사실이 될 수도 있지만, 신경 써야 할 부분이 아닙니다. –

+0

@KeithThompson 오타를 유감스럽게 생각합니다. 어쨌든'$ elf'에 대해서, 그것은 단지 상징 일 뿐이며,'$ foo' 권리보다 여전히 좋습니다. 당신이 상관하지 않는다면 그것은 중요하지 않습니다. – HuStmpHrrr

0

Makefile을 사용하는 또 다른 가능성은 .bashrc에 별칭을 추가하는 것입니다. 예에서 : $ gccm : 다음

$ echo "alias gccm='gcc -lm'" >> ~/.bashrc 

그리고, 당신의 .bashrc을 자원 지원 한 후, 당신은 그것을 사용할 수 있습니다. 그러나 진지하게, 그것은 당신이 를 절약하고있는 단지 3 명의 성격이다.

+0

'-lm'은 수학 라이브러리가 필요한 소스 또는 오브젝트 파일의 이름을 따라야합니다. 이 별칭은 작동하지 않습니다. 유사한 셸 함수,'gccm() {gcc "$ @"-lm; }'. –

+0

네 말이 맞아. 나는 여기에서 좀 새로운 사람이다. (1) 내가 내 대답을 제거하면 더 나을 까? (2) 답변으로 의견을 게시하지 않은 이유는 무엇입니까? –

+0

별칭이 아니지만 제공되는 인수 다음에 -lm을 추가하는 gccm이라는 작은 쉘 스크립트 또는 python 스크립트를 만들 수 있습니다. 일반적으로'gcc -o source source.c' 만 입력하면 컴파일 된, 어셈블 된, 링크 된 리눅스 실행 파일을 만들 수 있습니다. 그보다 더 복잡한 빌드가 필요한 모든 것을 작성하기까지는 다소 시간이 걸릴 것입니다. –

관련 문제