ホームページ  >  記事  >  システムチュートリアル  >  Linux Makefile の「すべきこと」と「してはいけないこと」: よくある間違いと落とし穴を回避する方法

Linux Makefile の「すべきこと」と「してはいけないこと」: よくある間違いと落とし穴を回避する方法

WBOY
WBOY転載
2024-02-11 12:12:12808ブラウズ

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 はパラメータの後のスペースを比較対象のパラメータの一部として扱うため、結果が意図に反します。

例の説明は次のとおりです (Makefile バージョン: GNU MAKE 3.81):

リーリー

実際のテストによると、$(TmpDir) の後のスペースは効果がないことが示されていますが、/Source の後のスペースは影響を及ぼします。

経験: Makefile では、パラメータの整合性、スペースの有無などを確保するのが最善です。C 言語などの言語でのプログラミングほど緩くはありません。


トラップ 3: mingw 環境でパスを使用する場合のトラップ

詳細: 正しく使用され、.d 依存関係ファイルを生成できる場合、理論上は、.h または .c ファイルの変更は自動的にコンパイルできますが、結果として、.h ファイルが次の場合には .h ファイルはコンパイルできなくなります。関連する .c ファイル、つまりファイルの更新が検出されなかったため、コンパイルされませんでした。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。