5

Makefile でやりたいことを実行するためのヘルプを探しています。

デバッグ用にコンパイルしている場合にのみコンパイルされる前処理コードを C ソースに追加する方法を見つけました。

#if DEBUG
  printf("main()\n");

  {
    /* Pauses execution so gdb can attach. */
    int i=9;
    pid_t PID;
    char hostname[256];
    gethostname(hostname, sizeof(hostname));
    printf("PID %d on %s ready for attach.\n", PID=getpid(), hostname);
    fflush(stdout);
    while (i>0) {
      sleep(5);
      i--;
    }
  }
#endif

そして、コンパイルステートメントに追加-DDEBUG=1すると、上記のコードがコンパイルされることがわかりました(そうでない場合はコンパイルされません)。

次に、オプションを含める、または含めないフラグを Makefile に渡したいと思い-Dます。現在、2 つの別個のコンパイル行があり、必要に応じてコメントとコメント解除を行っています。これが私のMakefileです(誰かから受け継いだもので、理解するのに苦労しています)。CFLAGS?:という行を参照してください。

SHELL = /bin/sh

prefix       = /home/schwarz/sundials/instdir
exec_prefix  = ${prefix}
includedir   = ${prefix}/include
libdir       = ${exec_prefix}/lib

CPP         = cc -E
CPPFLAGS    =
CC          = cc
# CFLAGS      = -Wall -g
CFLAGS      = -Wall -g -DDEBUG=1
# CFLAGS      = -g -O2
LDFLAGS     =
LIBS        = -lm
MPICC       = /usr/local/mpi/bin/mpicc
MPI_INC_DIR = /usr/local/mpi/bin/../include
MPI_LIB_DIR = /usr/local/mpi/bin/../lib
MPI_LIBS    =
MPI_FLAGS   =

INCLUDES = -I${includedir} -I${MPI_INC_DIR}
LIBRARIES = -lsundials_cvode -lsundials_nvecparallel ${LIBS}
LIBRARIES_BL =

EXAMPLES = FPU          # cvAdvDiff_non_p cvDiurnal_kry_bbd_p cvDiurnal_kry_p


OBJECTS = ${EXAMPLES:=.o}

# -----------------------------------------------------------------------------------------

.SUFFIXES : .o .c

.c.o :
        ${MPICC} ${CPPFLAGS} ${CFLAGS} ${MPI_FLAGS} ${INCLUDES} -c $<

# -----------------------------------------------------------------------------------------

all: ${OBJECTS}
        @for i in ${EXAMPLES} ; do \
          echo "${MPICC} -o $${i} $${i}.o ${MPI_FLAGS} ${CFLAGS} ${LDFLAGS} -L${libdir} ${LIBRARIES} -L${MPI_LIB_DIR} ${MPI_LIBS} ${LIBRARIES_BL}" ; \
          ${MPICC} -o $${i} $${i}.o ${MPI_FLAGS} ${CFLAGS} ${LDFLAGS} -L${libdir} ${LIBRARIES} -L${MPI_LIB_DIR} ${MPI_LIBS} ${LIBRARIES_BL}; \
        done

clean:
        rm -f ${OBJECTS}
        rm -f ${EXAMPLES}

私はウェブを検索しました-誓います!- しかし、makefile にパラメーターを渡す方法がわかりません。さまざまなコンパイルのニーズに合わせて同じコードのさまざまな種類のコンパイルを行うように、Makefile を設定するにはどうすればよいですか? Makefile に特定の値を渡すことができればさらに良いでしょう。これにより、特定の値がコンパイルに渡され、それを使用しiてコードを初期化できます。(IOW、私はとしてコンパイルしmake 8、Cはとしてコンパイルされますint i=8;)。Makeでもそれは可能ですか?

余談ですが、私は Makefiles と、それらがどのように機能するかについて、ラベル (コロン) を付けてファイルをリストし、その後に依存関係を続ける方法について読んだことがあります。しかし、この Makefile がどのように機能するのか、または 2 つのコンパイル ステートメントを発行する理由がわかりません。そのため、簡単な説明も役立ちます。

4

5 に答える 5

10

デバッグ バージョンとリリース バージョンのどちらかを選択するには:

ifeq($(debug),1)
  CFLAGS      = -Wall -g -DDEBUG=1
else
  CFLAGS      = -Wall -g
endif

そしてmakeを呼び出します:

make debug=1

DEBUG でコンパイルするには、または:

make

デバッグなしでコンパイルします。

i を初期化する場合:

#include <stdio.h>

#ifndef INIT_I
# define INIT_I 9
#endif
int main() {
  int i = INIT_I;
  return 0;
}

およびメイクファイル:

ifneq ($(init_i),)
CFLAGS = "-DINIT_I=$(init_i)"
endif

all:
  gcc d.c $(CFLAGS) -E

初期 i を設定するには:

make init_i=10

またはデフォルト値を使用します。

make
于 2012-08-27T09:34:51.007 に答える
3

メイクファイルの例:

...
CFLAGS = whatever
....
ifeq ("$(DEBUG)","yes")
CFLAGS += -DDEBUG=1
endif

これにより、次のように make を実行できます。

make "DEBUG=yes"

基本的に、make コマンド ラインで makefile 変数を設定できます。これらは、メイクファイル内の他の変数と同じように使用できるため、直接使用することもできます。

編集:ただし、注意する必要があります。オブジェクト ファイルに適切な名前を付けるか、別のビルド ディレクトリを使用するように注意しない限り、別の "DEBUG" 設定で make を実行しても、自動的に再コンパイルされません。

于 2012-08-27T09:35:13.503 に答える
2

はい、そうです。

gcc の-Dオプションを使用してマクロを宣言し、コードで使用できます。

> gcc -DMYINT=8 foo.c

foo.cで

int foo(void)
{
  int my = MYINT;
}

そしてあなたのメイクファイルで次を使用します:

CFLAGS    =    -DMYINT=$(MYINT)

そして make を呼び出します:

> make MYINT=8
于 2012-08-27T09:36:39.277 に答える
1

CFLAGS目的を達成する 1 つの方法は、シェルから makefile にの値を渡すことです。

CFLAGS='-Wall -g -DDEBUG=1' make -e 

デバッグバージョン、または

CFLAGS='-Wall -g' make -e

あなたの非デバッグ用

于 2012-08-27T09:36:21.837 に答える
1

次のように make で CFLAGS 変数を割り当てることができます: CFLAGS ?= -Wall -g -DDEBUG=1

パラメータなしで make コマンドを実行すると、CFLAGS のデフォルト値は「-Wall -g -DDEBUG=1」になります。

make を次のように実行すると: make CFLAGS='-DDEBUG=0'

このコマンドは CFLAGS 値に値 '-DDEBUG=0' を割り当てます 割り当てられた値は makefile で割り当てられたデフォルト値を上書きします

于 2012-08-27T09:38:25.430 に答える