带有makefile的嵌套输出文件夹

带有makefile的嵌套输出文件夹,makefile,Makefile,我试图创建一个嵌套的输出文件夹结构来构建一个开源库。但是,我以前从未使用过makefile,并且有一些基本问题 在阅读了一些文档之后,我设法创建了嵌套文件夹,并正确编译了所有对象文件。但是,还有一些错误,我无法理解 一个简单的makefile示例(从原始makefile修改): SRC = ../src/lib OUT = rtklib_post_proc LIB = $(OUT)/lib OPTS = -DTRACE -DENAGLO -DENAQZS -DEN

我试图创建一个嵌套的输出文件夹结构来构建一个开源库。但是,我以前从未使用过makefile,并且有一些基本问题

在阅读了一些文档之后,我设法创建了嵌套文件夹,并正确编译了所有对象文件。但是,还有一些错误,我无法理解

一个简单的makefile示例(从原始makefile修改):

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
有错误的输出:

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
任何解决这个问题的指导都会非常好

只需稍作更改即可更新:

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
结果:

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
更新2:

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
结果:

SRC     = ../src/lib
OUT     = rtklib_post_proc
LIB     = $(OUT)/lib

OPTS    = -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3

# For using lapack and blas
CFLAGS  = -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I$(SRC) -DLAPACK $(OPTS)
LDLIBS  = -lm -lrt -llapack -lblas

all        : rnx2rtkp
rnx2rtkp   : rnx2rtkp.o postpos.o

rnx2rtkp.o : ../src/rnx2rtkp.c
    mkdir -p $(OUT)
    $(CC) -c $(CFLAGS) ../src/rnx2rtkp.c -o $(OUT)/$@
postpos.o  : $(SRC)/postpos.c
    mkdir -p $(LIB)
    $(CC) -c $(CFLAGS) $(SRC)/postpos.c -o $(LIB)/$@

$(LIB)/rnx2rtkp.o : $(SRC)/rtklib.h
$(LIB)/postpos.o  : $(SRC)/rtklib.h
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
mkdir -p rtklib_post_proc/lib
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/lib/postpos.c -o rtklib_post_proc/lib/postpos.o
cc   rnx2rtkp.o postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o
mkdir -p rtklib_post_proc
cc -c -Wall -O3 -ansi -pedantic -Wno-unused-but-set-variable -I../src/lib -DLAPACK -DTRACE -DENAGLO -DENAQZS -DENAGAL -DNFREQ=3 ../src/rnx2rtkp.c -o rtklib_post_proc/rnx2rtkp.o
cc   rnx2rtkp.o rtklib_post_proc/rnx2rtkp.o rtklib_post_proc/lib/postpos.o -lm -lrt -llapack -lblas -o rnx2rtkp
cc: error: rnx2rtkp.o: No such file or directory
cc: error: rtklib_post_proc/lib/postpos.o: No such file or directory
make: *** [rnx2rtkp] Error 1
all        : $(OUT)/rnx2rtkp
make: *** No rule to make target `rtklib_post_proc/rnx2rtkp', needed by `all'.  Stop.
这一行表示与makefile位于同一目录中的
rnx2rtkp.o
取决于源文件。那不是正确的位置

另外,在同一行中添加文件的所有依赖项:

尝试:

并删除下面的依赖项
$(LIB)/rnx2rtkp.o:$(SRC)/rtklib.h

您还需要更新中间依赖项:

rnx2rtkp   : $(OUT)/rnx2rtkp.o $(LIB)/postpos.o

然后对
postos
执行相同的操作。确保在使用
$LIB
$OUT
时保持一致
rnx2rtkp:rnx2rtkp.o postos.o
。依赖关系是错误的。它们需要以
$(OUT)/
$(LIB)/
作为前缀,因为这是构建对象的地方。更新了问题,抱歉没有起作用,我肯定错过了一些东西。你能不能加上一些细节作为回答。谢谢。很难理解为什么有人会在没有任何解释的情况下否决这个问题。那太令人沮丧了。谢谢,我厌倦了,一切都顺利。但最后,它没有生成可执行文件。我会继续从GNU make手册中检查,看看我是否做错了什么。在你的问题中,你没有包含任何将对象文件链接到可执行文件的命令。也许这就是你所缺少的?