2017-12-03 19 views
2

를 포함하는 방법내가 사용 컴파일 할 나는 프로그램이 <code>neuromz</code>을 불렀다 Makefile.am에 -lm 또는 configure.ac

gcc neuromz.c -lm -o neuromz 

이 작업 괜찮아요하지만 난 내 프로젝트에 추가 할 경우 configure.acMakefile.am , Makefile.am으로 :

bin_PROGRAMS = neuromz 
neuromz_SOURCES = neuromz.c neuromz.h ann.c ann.h 
neuromz_CFLAGS = -lm 

결과는 다음

,
/home/mz/programming/ctest/ANN/ann.c:11: undefined reference to `exp' 
/home/mz/programming/ctest/ANN/ann.c:11: undefined reference to `exp' 

어떻게 해결할 수 있습니까?

답변

0

를 참조하십시오, 프로그램에 추가 라이브러리를 지정하기위한 Automake의 변수는 *_LDADD입니다. 그러나 하나의 프로그램 만 만들거나 빌드하려는 모든 프로그램에 동일한 라이브러리가 필요한 경우 LDADD을 대신 사용할 수 있습니다. 이것은 더 편리 할 수 ​​있고, 때로는 너무 작은 Makefile 년대를 생성합니다

bin_PROGRAMS = neuromz 
LDADD = -lm 

neuromz_SOURCES = neuromz.c neuromz.h ann.c ann.h 

을 그러나 빌드 시스템에 의해 만들어진 프로그램에 대한 단번에 모든 결정에 대해 libm를 만들기 위해 만족하는 경우 , 그렇다면 Automake 대신 Autoconf에서 처리하는 것이 좋습니다. 당신이 다음

  • AC_SEARCH_LIBS([sqrt], [m]) 
    

    ... ... 당신의 configure.ac에 넣고 경우 configure 스크립트는 libm 필요가 명시 적으로 사용자의 환경 및 도구에 의존하는 (전혀 연결 할 수 있는지 여부를 확인합니다 체인)이며 필요한 경우에만 -lm이 추가됩니다.

  • Makefile.am에 그것에 대해 아무 말도 할 필요가 없으며 사용할 Automake 변수와 관련이 없습니다.

4

귀하의 명령 행 : 때문에,

gcc -c -o neuromz.o neuromz.c # Compile 
gcc -o neuromz neuromz.o -lm # Link 

Automake가 항상 컴파일 및 링크를 분리 :

gcc neuromz.c -lm -o neuromz 

당신이했던 것처럼 GCC가 유용하게 필요한 컴파일 단계와 링크 단계로 변환하는 것을 속기 일반적으로 은 가능한 한 경제적으로 만듭니다.

neuromz_CFLAGS = -lm 

neuromz.c를 컴파일하는 컴파일러 옵션 (CFLAGS)에 -lm을 추가합니다. 그러나 -lm (= 수학 라이브러리 연결)은 링크 옵션이며 컴파일시 무시됩니다. 당신은 그것을 연결 옵션 (LDADD)에서 필요

neuromz_LDADD = -lm 

가 @MikeKinghan 이미 설명한 바와 같이 automake manual 8.4 Program and Library Variables