2016-06-07 2 views
2

때로는 소스에서 패키지를 빌드 할 때 결과 바이너리에 내가 사용중인 빌드 플래그에 대한 참조가 포함 된 것 같습니다.컴파일 된 라이브러리가 빌드 명령을 내부적으로 저장하게하는 원인은 무엇입니까?

제가 작업하고있는 예제는 fftw 라이브러리입니다. 다운로드하고 빌드하는 방법은 다음과 같습니다.

FWIW,이 줄은 실행하는 데 약 30 초 정도 걸리므로 시도해보십시오.

cd /tmp 
wget http://www.fftw.org/fftw-3.3.4.tar.gz 
tar xf fftw-3.3.4.tar.gz 
cd fftw-3.3.4 
CFLAGS="-I/foo/bar" ./configure --prefix=/tmp # We aren't going to run 'make install', 
               # so the --prefix is unimportant. 

make -j4 

이제 컴파일 된 출력을 검사 해 봅시다. 어리석은 -I/foo/bar 플래그가 바이너리 자체에서 종료되었음을 주목하십시오! 나는, 그것을 방지하거나 일어나는 이유를 적어도 이해하고 싶습니다 (패키지 관리 도구에 관한) 여기에서 언급 할 가치가 기술적 인 이유를 들어

$ strings .libs/libfftw3.a | grep gcc 
gcc -I/foo/bar 

하고 중요한 경우

.

진술 : 이것은 공유 라이브러리와 정적 라이브러리 모두 Linux 및 OS X에서 발생하는 것으로 보입니다.

+1

재생할 수 없음 [여기] (http://coliru.stacked-crooked.com/a/522a2aa00b1fa5d5). [mcve]를 입력하십시오. –

+0

@ n.m. 좋아, 실제 예제 (fftw)를 제공하기 위해 질문을 편집했습니다. 자신의 컴퓨터에 해당 명령을 복사 + 붙여 넣을 수 있습니다. 실행하는 데 약 30 초 밖에 걸리지 않습니다. –

+0

생성 된'Makefile'-s –

답변

0

이것은 fftw에 특유한 것으로 밝혀졌습니다. @ n.m에 감사드립니다. 내가 그걸 볼 수 있도록 도와주었습니다.

fftw 소스에는 다음과 같은 행이 있습니다. (여기 단순화.)

// api/version.c 
const char fftwf_cc[] = FFTW_CC; 

그리고 그 구성/수 있도록 스크립트를 통해

은 FFTW 다음 빌드 명령과 같이 사용 (다시를 대폭 여기 단순화).

gcc -I/foo/bar -DFFTW_CC='"gcc -I/foo/bar"' -c api/version.c 

... 그래서 결국 라이브러리에 컴파일됩니다.

관련 문제