23

TinyOSを学ぶ過程で、私はmakefileについてまったく無知であることに気づきました。

プリプロセッサ変数を宣言することで使用できる、オプションのコンパイル時機能が多数あります。

それらを使用するには、次のようなことを行う必要があります。

CFLAGS="-DPACKET_LINK" これにより、特定の機能が有効になります。

CFLAGS="-DPACKET_LINK" "-DLOW_POWER"2つの機能を有効にします。

誰かが私のためにこれらの行を分析して、何が起こっているのか教えてもらえますか?TinyOSの観点からではなく、makefileの観点から!

4

5 に答える 5

27

CFLAGS は、コンパイラに引数を追加するために最も一般的に使用される変数です。この場合、マクロを定義します。

したがって、これは、プロジェクト内のすべての .c および .h ファイルの先頭に配置する-DPACKET_LINKことと同じです。#define PACKET_LINK 1ほとんどの場合、これらのマクロが定義されているかどうかを調べ、それに応じて何かを実行するコードがプロジェクト内にあります。

#ifdef PACKET_LINK
// This code will be ignored if PACKET_LINK is not defined
do_packet_link_stuff();
#endif

#ifdef LOW_POWER
// This code will be ignored if LOW_POWER is not defined    
handle_powersaving_functions();
#endif

メイクファイルをさらに下に見ると、$(CFLAGS)おそらく次のように使用されていることがわかります。

$(CC) $(CFLAGS) ...some-more-arguments...
于 2008-09-17T07:07:36.583 に答える
8

makefile のどこかで、次のようにコンパイル行で CFLAG が使用されます。
$(CC) $(CFLAGS) $(C_INCLUDES) $<

最終的には実行時に次のように変換されます:

gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o

この定義は、ヘッダー ファイルでの定義と同じようにソース コードに渡されます。

于 2008-09-17T07:05:54.700 に答える
3

-D オプションはプリプロセッサ変数を設定するため、この場合、指定された「#ifdef / #endif」ブロックにあるすべてのコードがコンパイルされます。

いえ

#ifdef PACKET_LINK
/* whatever code here */
#endif

CFLAGS は makefile で使用される変数であり、コンパイラが呼び出されたときにその内容に展開されます。

例えば

gcc $(CFLAGS) source.c
于 2008-09-17T07:12:36.820 に答える
1

完全を期すために、Microsoft の nmake ユーティリティを使用している場合、makefile で使用されている $(CFLAGS) マクロが実際には表示されない可能性があります。これは、nmake には C/C++ ファイルのコンパイルなどのデフォルトがいくつかあるためです。とりわけ、以下は nmake で事前に定義されているため (GNU Make がこのようなことを行うかどうかはわかりません)、Windows で動作する makefile には表示されない可能性があります。

.c.exe:
    commands:          $(CC) $(CFLAGS) $<

.c.obj:
    commands:          $(CC) $(CFLAGS) /c $<

.cpp.exe:
    commands:          $(CXX) $(CXXFLAGS) $<

.cpp.obj:
    commands:          $(CXX) $(CXXFLAGS) /c $<
于 2008-09-17T07:43:54.330 に答える
1

-D は、少なくとも定義(gcc 内) を表し、ファイルの代わりにコマンドラインで #define を実行できます。一般的に見られるのは -DDEBUG または -DNDEBUG で、それぞれデバッグ コードを有効または無効にします。

于 2008-09-17T07:11:01.660 に答える