>  기사  >  시스템 튜토리얼  >  Linux Makefile 해야 할 것과 하지 말아야 할 것: 일반적인 실수와 함정을 피하는 방법

Linux Makefile 해야 할 것과 하지 말아야 할 것: 일반적인 실수와 함정을 피하는 방법

WBOY
WBOY앞으로
2024-02-11 12:12:12850검색

Makefile은 Linux 시스템에서 일반적으로 사용되는 파일 형식으로, 프로그램의 컴파일 프로세스와 종속성을 설명하는 데 사용할 수 있으므로 사용자는 make 명령을 사용하여 프로그램을 쉽게 빌드하고 관리할 수 있습니다. Makefile의 구문과 규칙은 비교적 간단하지만 주의해야 할 몇 가지 세부 사항과 특별한 경우가 있습니다. 그렇지 않으면 컴파일이 실패하거나 예상치 못한 결과가 발생할 수 있습니다. 이 기사에서는 Linux Makefile의 몇 가지 일반적인 오류와 함정, 이를 방지하고 해결하는 방법을 소개하여 Linux에서 Makefile을 더 잘 사용하고 작성할 수 있습니다.

Linux Makefile 的注意事项:如何避免常见的错误和陷阱


트랩 1: '#' 주석 문자는 변수를 정의하는 명령문 뒤의 공백 뒤에 사용됩니다

결과: 변수의 값은 사용자가 할당한 값이 아니지만 값과 주석 문자 사이의 공백이 변수에 할당되어 있어 사용자의 의지에 반하여 실행되고 감지하기가 쉽지 않습니다.

예제 설명은 다음과 같습니다. (Makefile 버전: GNU MAKE 3.81):

으아아아 으아아아

확장 1: 사실 확인 프로세스는 ifeq() 문의 트랩인 또 다른 트랩으로 이어집니다. 트랩 2를 참조하세요.
확장 2: 변수 할당 문에 이 트랩이 있습니다. 매크로 정의 문은 어떻습니까? 및 다음과 유사한 문장

으아아아

실제 테스트 결과, 소스 파일의 매크로 정의 "TMP" 값과 "INCFLAGS" 경로 값에는 영향을 미치지 않는 것으로 나타났습니다.

경험치: 위의 검증을 통해 주석은 Makefile 파일 내부에 정의된 변수의 값에 영향을 주지만 -D 및 -I 이후의 값에는 영향을 미치지 않습니다. 따라서 유사한 문제를 피하기 위해 Makefile의 주석은 명령문 뒤가 아닌 명령문 앞 줄에 작성하는 것이 좋습니다.


트랩 2: ifeq 문의 괄호 안에 공백을 사용하지 마세요

결과: 메이크파일은 매개변수 뒤의 공백을 비교를 위한 매개변수의 일부로 처리하여 결과가 원하는 것과 다르게 됩니다.

예제 설명은 다음과 같습니다. (Makefile 버전: GNU MAKE 3.81):

으아아아

실제 테스트에 따르면 $(TmpDir) 뒤의 몇 개의 공백은 효과가 없지만 /Source 뒤의 공백은 영향을 미치는 것으로 나타났습니다

경험:

Makefile에서는 공백 여부 등 매개변수의 일관성을 보장하는 것이 가장 좋습니다. C 언어와 같은 언어로 프로그래밍하는 것만큼 느슨하지 않습니다.


트랩 3: mingw 환경에서 경로를 사용할 때 발생하는 트랩

세부 사항: 올바르게 사용하고 .d 종속 파일을 생성할 수 있는 경우 이론적으로 .h 또는 .c 파일을 수정하면 자동으로 컴파일될 수 있지만 결과적으로 수정 후 .h 파일을 컴파일할 수 없습니다. 즉, 파일 업데이트가 감지되지 않아 컴파일이 수행되지 않았습니다. Makefile의 내용을 주의 깊게 살펴보면 단서를 쉽게 찾을 수 없습니다. 사실, 이 뒤에는 감지하기 쉽지 않은 함정이 있습니다.

예제는 대략 다음과 같습니다.

으아아아

클릭하여 .d 종속 파일 관련 내용 소개를 입력하세요

실제로 결과를 보면 .d 종속 파일에 문제가 있음을 대략적으로 추론할 수 있습니다. 파일을 다시 작성하려면 .d 종속 파일이 제공해야 하는 기능인 재컴파일이 필요하기 때문입니다.

陷阱:目标路径的问题,即同一文件目标的引用时要保持路径一致。mingw环境下,windows路径(e.g. c:\agc.o) 和 mingw路径(/c/agc.o)都能够识别,对于make而言, c:\abc.o 和 /c/abc.o 是两个不同的目标。若要是不知道这一知识要点,很难发现 .d 文件开头 c:\ 和 /c/ 的区别。(个人疑点:同一环境,不同工程,有些生成的.d依赖文件中.o目标路径和make中引用的路径是一样的,目前也不知是什么原因,总之这个陷阱还是存在的。)

实例陷阱说明:

#以下行将导入所有的.d依赖文件的内容,即以 /c/...开头的内容
-include $(APPDEPS)
#而以下目标依赖关系中,指明目标的路径则是以 c:\...开头的路径
$(DEV_BLD_DIR)/%.o: %.c
#其结果就是导致了因路径表示的不同,而认为不是同一目标的情况出现
#使得make不能找到.o目标文件依赖的所有依赖源文件,其中包括.h头文件
#自然而然,也就不能因为.h文件的更新,而重新编译对应的.c文件来生成.o文件

解决方法:
既然知道了陷阱所在,就可以利用如下命令来解决该问题:

#通过增加sed命令,把生成的.d依赖文件中的.o目标路径改写就可以了。
$(DEV_BLD_DIR)/%.o: %.c
    $(info Compiling $$@) $(CFLAGS) $(INCFLAGS) $'s,.*\.o[ :]*,$@:,g'  $(DEV_BLD_DIR)/$*.d;\
        rm -f $(DEV_BLD_DIR)/$*.d.tmp
    @echo

通过本文,你应该对 Linux Makefile 中的一些注意事项有了一个基本的了解,知道了如何避免和解决一些常见的错误和陷阱,如变量赋值、条件判断、目标文件、伪目标、自动变量等。你也应该明白了 Makefile 的作用和优点,以及如何在 Linux 下正确地使用和编写 Makefile。我们建议你在使用 Makefile 时要遵循一些规范和习惯,如使用缩进、注释、通配符等,以提高 Makefile 的可读性和可维护性。同时,我们也提醒你在使用 Makefile 时要注意一些潜在的问题和挑战,如跨平台、并行编译、递归调用等。希望本文能够帮助你更好地使用 Linux 系统,让你在 Linux 下编写出高效和优雅的 Makefile。

위 내용은 Linux Makefile 해야 할 것과 하지 말아야 할 것: 일반적인 실수와 함정을 피하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제