나는 일반적으로 makefile을 생성하기 위해 일반적인 단계를 사용합니다. 먼저 "build.sh init"를 사용하여 구성 파일을 생성한 다음 "configure"를 사용하여 makefile 및 makefile.am 파일을 생성합니다. 이제 일부 포함 파일에서 "../../"를 추정하고 싶습니다(예: include "../../dirA/dirB/Ch"). 그냥 include "dirA/dirB/Ch"로 작성하면 됩니다. configure.ac 또는 makefile.am을 수정해야 합니다. 누구든지 이 문제를 해결하는 데 도움을 줄 수 있나요?
답변1
가장 먼저 주목해야 할 점은 구성 시스템에 두 개의 top_dir이 있다는 것입니다. 소스 코드가 있는 최상위 디렉터리와 코드가 생성되는 최상위 디렉터리입니다. 일반적으로 이 두 디렉터리는 동일합니다. 그러나 경우에 따라 소스 코드가 읽기 전용 파일 시스템에 있으므로 다른 곳에서 소프트웨어를 빌드해야 합니다. 아래에서는 최상위 빌드 디렉터리를 사용하겠습니다. 이 디렉터리는 최상위 소스 디렉터리와 동일할 수 있습니다.
autoconf는 이미 최상위 빌드 디렉터리에 대한 여러 변수를 정의합니다. 그 중 하나는 "abs_top_builddir"입니다.
이름이 "abs_top_builddir"인 포함 파일을 사용한다고 가정하면 x.h
. x.h.in
이 변수는 "@"으로 묶어서 파일에서 참조됩니다. 따라서 다음이 있을 수 있습니다.
#include "@abs_top_builddir@/A/dirB/C.h"
당신이해야 할 또 다른 일은 말해주는 것입니다.구성x.h
헤더 파일을 생성하는 스크립트입니다 x.h.in
. 추가하면 이렇게 할 수 있습니다.
AC_CONFIG_FILES([x.h])
AC_OUTPUT
끝까지구성 파일. 하나만 필요하므로 AC_OUTPUT
행이 이미 존재하는 경우 다시 추가할 필요가 없습니다. 이제 실행 autoconf
하여 구성 스크립트를 생성하십시오. 실행 시 다음과 같은 내용 configure
이 표시됩니다.
configure: creating x.h
x.h
포함 줄이 예상과 일치하는지 확인하세요 .
위의 모든 내용을 작성한 후에는 이것이 일반적으로 수행되는 작업이 아니라는 점도 지적하고 싶습니다. 대신 in CFLAGS
또는 비슷한 이름의 변수에 디렉터리만 포함하면 됩니다. 예를 들어 Makefile.am에는 다음이 있을 수 있습니다.
AM_CPPFLAGS = -I$(top_srcdir)
여기서는 다음으로 전환합니다.소스 디렉토리이전처럼 헤더를 만들 필요가 없기 때문입니다. 아마도 추가 줄을 추가할 필요가 없을 것입니다.구성 파일그 줄은 아마도 이미 거기에 있을 것이기 때문입니다.