2017-12-21 43 views
1

어떤 이유로 저는 현대적인 프로그래밍 방법에 익숙하지 않습니다. 68k 어셈블리 프로그래머로서, 나는 하나의 트리 파일을 사용하여 모든 것을 최종 파일에 연결하는 대신,보다 전형적인 "빌드/링크 객체"체계를 따르기 위해 노력하고있다. 그러나 나는 논리적 인 설명을 찾고이 문제를 해결하기 위해 4 일을 보냈다.GNU Make가 명백한 규칙을 감지하지 못합니다.

특정 폴더에서 모든 파일을 자동으로 검색 및 빌드하려고합니다.이 파일은 특별히 정의 된 개체로 묶여 있으며 특별히 정의 된 다른 개체와 함께 연결됩니다. 문제는 위에있는 https://pastebin.com/H6QE29fj

CUR = $(SRC)\lib 
VPATH = $(OBJ) $(CUR) 
INPUT = $(notdir $(wildcard $(CUR:\=/)/*)) 
$(OBJ)\library.md.o: $(INPUT:.asm=.o) 
    $(VLINK) -r -o [email protected] $(addprefix $(OBJ)\,$(notdir $^)) 

:

은 메이크입니다. 며칠 전에 $ (OBJ) \ ints.md.o를 $ (SRC) \ ints 폴더에서 생성하기 위해이 코드 스 니펫을 사용했습니다. 전혀 문제가 없으므로 $ (INPUT) 변수를 사용하기 바로 전에 파일 이름을 수동으로 추가하기 때문에 SECTION (engine shenanigans)의 시작 부분에 어셈블됩니다.

상기 코드가 "작동"하면 라이브러리에서 왜 작동하지 않습니까?

make: *** No rule to make target `loadtilemap.o', needed by `.\src\__obj\library.md.o'. Stop. 

% .o : % .asm 규칙으로 충분하지 않아야합니까?

답변

3

먼저 메이크 파일의 경로로 작업 할 때는 항상 백 슬래시가 아닌 슬래시를 사용하는 것이 좋습니다. 거의 모든 Windows 명령은 경로에서 두 가지 스타일을 모두 허용합니다. 슬래시를 경로 구분자로 사용할 수없는 명령을 호출해야하는 경우 필요한 위치의 레서피로 변환하십시오. make은 UNIX/POSIX 도구이므로 일반적으로 디렉토리 분리 기호에 슬래시를 사용하고 이스케이프 문자열로 백 슬래시를 사용합니다. Windows 용으로 컴파일 할 때 백 슬래시와 관련하여 DTRT에 약간의 노력이 있지만 어디에서나 작동하지 않을 수 있습니다. 슬래시를 사용하고 다른 것들로 이동하십시오. 대상이 [email protected] 이외의 파일을 생성하는 것이 (거의) 결코 올바른

%.o: %.asm 
     $(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename [email protected])).txt -o $(OBJ)\[email protected] $< 

:

은 여기 메이크에서 힌트입니다. 이것은 내 Second Rule of Makefiles입니다. [email protected] 일반 파일이 아닌 규칙을 보면 언제든지 문제가 있음을 알 수 있습니다. Make는 목표물을 만들고 싶습니다. 빌드하고자하는 대상을 알고 경로 변수를 [email protected] 변수에 넣습니다. 조리법에서 이 아닌이 아닌 파일을 만들 필요성을 느낀다면 근본적인 것에 동의하지 않고 make와 동의하지 않으면 원하는 결과를 얻을 수 없습니다. 같은 다음 디렉토리가 규칙에 포함되어야합니다 소스로 하나가 아닌 디렉토리에있는 파일을 만들려면

는 :

:

$(OBJ)/%.o: %.asm 
     $(V68k) $(BUILDARGS) -L $(LST)\$(notdir $(basename [email protected])).txt -o [email protected] $< 

를이 또한 링크 조리법을 의미

$(OBJ)\library.md.o: $(INPUT:.asm=.o) 
     $(VLINK) -r -o [email protected] $(addprefix $(OBJ)\,$(notdir $^)) 

은 작동하지 않습니다. 왜? 선행 조건에는 디렉토리가 포함되어 있지 않기 때문입니다. 당신은이를 변경해야

$(OBJ)\library.md.o: $(INPUT:%.asm=$(OBJ)/%.o) 
     $(VLINK) -r -o [email protected] $^ 

당신은 $(OBJ)VPATH에 추가하면이 문제를 해결 도움이 될 것으로 생각하지만 그렇지 않습니다.그것이 작동하도록 설계된 방법이 아니기 때문에 VPATH; VPATH소스 파일 개를 검색하는 데만 사용할 수 있으며 절대 오브젝트 파일과 같은 파일을 생성하지 않습니다. 이유는 복잡하지만 세부 정보가 필요하면 detailed explanation here입니다.

+0

나는 그것을 작동 시켰고, 지금은 훨씬 더 나아 보인다. 고마워요! :디 –