문제

플러그인 시스템의 경우 단일 DLL을 컴파일하는 MakeFile 템플릿이 있습니다. 사용자의 makefile은 다음과 같습니다.

EXTRA_SRCS=file1 file2
include makefile.in

에서 makefile.in 나는 가지고있다:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))

어디에 plugin.os 컴파일 할 기본 C ++ 파일입니다. BTW, 파일 끝입니다 .os 공유 라이브러리를 위해 컴파일 된 객체 파일 (즉, -fpic 옵션 gcc)

이제 문제는 추가 소스가 아마도 헤더 파일 일 것입니다. 이상적으로는 대상의 종속성으로 추가하고 싶습니다. plugin.os 그리고 file.cpp, 그러나 그들이 존재하는 경우에만.

이 방법은 Windows와 Linux 모두에서 작동하거나 적어도 각각에 적응할 수 있어야합니다. 그러나 나는 GNU 버전의 Make 만 사용합니다.

도움이 되었습니까?

해결책

"와일드 카드"기능을 사용하십시오.

$(wildcard *.h)

편집 : 특정 목록과 일치하려면

$(wildcard $(HEADER_FILES))

$ (필터 ...)를 사용할 필요가 없으며 와일드 카드 기능은 존재하지 않는 파일을 자동으로 필터링합니다.

다른 팁

사용중인 컴파일러를 지정하지 않았지만 GCC/G ++에 액세스 할 수있는 경우 -mm 옵션을 사용할 수 있습니다.

내가하는 일은 모든 .c 또는 .cpp 파일마다 .d의 확장자가있는 파일을 작성한 다음 .D 파일을 "포함"하는 것입니다. 나는 makefile에서 이와 같은 것을 사용합니다.

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

그런 다음 다음과 같은 종속성을 만듭니다.

C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)

그리고 이것은 makefile의 맨 아래에 있습니다.

include $(DEPS)

이것이 당신이가는 행동의 종류입니까? 이 방법의 장점은 실제 컴파일에 비 GNU 컴파일러를 사용하더라도 GNU 컴파일러가 종속성을 계산하는 데 적합한 작업을 수행한다는 것입니다.

간단합니다

$(filter $(wildcard *.h),$(HEADER_FILES))

당신이 원하는 것을합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top