编译多个 c++ 文件不适用于某些文件名

Compiling multiple c++ files doesn't work with certain file names

我正在尝试编译多个 .cpp 文件,使用带有 make 的 Makefile。我有一个包含 main 函数的 .cpp 文件,在另一个 .cpp 文件中有一个基本的 class (对于每一个疑问,我都会把我正在使用的所有代码放在这里)。 用于编译或不编译的名称示例:

-它的工作原理是将它们命名为“prova.cpp”(包含主要功能)和“pa.cpp”(包含 class)(在 Makefile 完成的命令下方) )

gioele@GioPC-U:~/Dev/Cpp/Exercises/666prova$ make
g++ -g -Wall -c src/prova.cpp -o obj/prova.o
g++ -g -Wall -c src/pa.cpp -o obj/pa.o
g++ -g -Wall obj/prova.o -o bin/provaBin

-它通过将它们命名为“ciao.cpp”(包含主函数)和“pa.cpp”(包含class)

gioele@GioPC-U:~/Dev/Cpp/Exercises/666prova$ make
g++ -g -Wall -c src/pa.cpp -o obj/pa.o
g++ -g -Wall -c src/ciao.cpp -o obj/ciao.o
g++ -g -Wall obj/pa.o -o bin/provaBin
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [Makefile:15: bin/provaBin] Errore 1

我认为问题在于 Makefile 中文件的顺序。当它不起作用时是因为试图在没有 main 函数的情况下从 .o 获取二进制文件。不知道如何解决。

主要方法文件:

#include <iostream>

int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

class 文件:

class Class {
public:
    int x;
    int y;
};

Makefile(仍在学习使用 Makefile,可能问题就出在这里,如果我使用不正确的东西,请提出任何改进此类 Makefile 的建议):

CC=g++
CFLAGS=-g -Wall
OBJ=obj
SRC=src
BINDIR=bin
BIN=$(BINDIR)/provaBin

SRCS=$(wildcard $(SRC)/*.cpp)
OBJS=$(patsubst $(SRC)/%.cpp, $(OBJ)/%.o, $(SRCS))

all: $(BIN)

$(BIN): $(OBJS)
    $(CC) $(CFLAGS) $< -o $@

$(OBJ)/%.o: $(SRC)/%.cpp
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    $(RM) $(BINDIR)/* $(OBJ)/*

提前致谢。

您可以通过更改一个字符来解决此问题。

在这条规则中:

$(BIN): $(OBJS)
    $(CC) $(CFLAGS) $< -o $@

先决条件列表 $(OBJS) 扩展为目标文件列表,例如 prova.o pa.opa.o ciao.o。您希望 Make 将该列表合并到链接命令中,如下所示:

g++ -g -Wall prova.o pa.o -o bin/provaBin

但自动变量 $< 扩展为 仅先决条件列表中的第一项 。如果第一项是不包含main()函数的目标文件,比如pa.o,链接器会抱怨缺少main()。 (如果是包含main()的目标文件,比如prova.o,那么你不会得到那个错误,但你可能还是有问题。)

解决方案是使用 automatic variable $^,它扩展到完整的先决条件列表:

$(BIN): $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@