C++ 转换为makefile

C++ 转换为makefile,c++,gcc,C++,Gcc,如何将其转换为makefile?这就是我现在拥有的: gcc code.c -I/opt/local/include -L/opt/local/lib -lnetcdf -lm -fpic -o code 请注意,下面的makefile可以工作 IDIR =/opt/local/include CC=gcc CFLAGS=-I$(IDIR) ODIR=obj LDIR =/opt/local/lib LIBS=-lm code: $(OBJ) gcc -o $@ $^ $(CFL

如何将其转换为makefile?这就是我现在拥有的:

gcc code.c -I/opt/local/include -L/opt/local/lib -lnetcdf -lm -fpic -o code

请注意,下面的makefile可以工作

IDIR =/opt/local/include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=obj
LDIR =/opt/local/lib

LIBS=-lm

code: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 
然后,只需将变量添加到makefile中。比如说

code: code.o
    gcc code.o -o code

code.o: code.c
    gcc -c code.c -I/opt/local/include -L/opt/local/lib -lnetcdf -lm -fpic

clean:
    rm *.o code

我使用更通用的makefile:

OBJ=code.o
CC=gcc
IDIR=/opt/local/include
LDIR=/opt/local/lib
CFLAGS=-lnetcdf -lm -fpic

code: $(OBJ)
    $(CC) $(OBJ) -o code

code.o: code.c
    $(CC) -c code.c -I$(IDIR) -L$(LDIR) $(CFLAGS)

clean:
    rm *.o code
注意:

  • 将所有编译标志放在CFLAGS中
  • 将所有要链接的库放在库中(不要添加-l前缀)
  • 将所有库目录放在lib_DIRS中(不要添加-L前缀)
  • 将所有源目录放入SRC_目录
  • 将所有include目录放在include_DIRS中(不要添加-I前缀)

  • 您没有在Makefile中定义
    OBJ
    。请查看我的答案,它可能看起来更复杂,但一旦您理解它,它将在许多项目中为您服务,只需稍加修改。
    NAME            := $(shell basename $(shell pwd))
    OBJ             := $(NAME).o
    CC              := gcc 
    CFLAGS          := -fpic
    LIBS            := m netcdf
    LIB_DIRS        := lib_dirs
    SRC_DIRS        := src 
    INCLUDE_DIRS    := inc 
    
    LIB_FLAGS       := $(patsubst %,-L%, $(LIB_DIRS))
    LIB_FLAGS       += $(patsubst %,-l%, $(LIBS))
    INCLUDE_FLAGS   := $(patsubst %,-I%, $(INCLUDE_DIRS))
    SRC_FILES       := $(shell find $(SRC_DIRS) -name *.c)
    
    all:
        $(CC) -c $(SRC_FILES) $(INCLUDE_FLAGS) $(LIB_FLAGS) $(CFLAGS) -o $(OBJ)
    
    clean:
        rm $(OBJ)