g++ 没有编译我项目中的所有文件

g++ isn't compiling all of the files in my project

我正在尝试在 VS Code 中构建一个 C++ 项目,但是当我尝试构建它时,G++ 会抛出一条错误消息:

g++ -std=c++17 -ggdb -Iinclude src/main.cpp -o bin/main 
Undefined symbols for architecture x86_64:
  "MessageBus::MessageBus()", referenced from:
      _main in main-244f95.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [bin/main] Error 1
The terminal process "/bin/zsh '-c', 'make'" terminated with exit code: 2.

以下是我认为导致问题的文件:

MessageBus.h

#pragma once
#include "../Utils/Queue.h"
#include "../Utils/SimpleList.h"
#include "Messages/Message.h"

class System;

class MessageBus
{
public:
    MessageBus();
    ~MessageBus();

    void addReciever(System* system);
    void postMessage(Message* msg);
    void notify();

private:
    Queue<Message> msgQueue;
    SimpleList<System*> systems;
};

MessageBus.cpp

#include "MessageBus.h"
#include "System.h"

MessageBus::MessageBus() {}
MessageBus::~MessageBus() {}

void MessageBus::postMessage(Message* msg) {
    msgQueue.add(msg);
}

void MessageBus::addReciever(System* system) {
    systems.add(system);
}

void MessageBus::notify() {
    int queueLength = msgQueue.getLength();
    for (int i = 0; i < queueLength; i++) {
        Message msg = msgQueue.pop();
        for (int j = 0; j < systems.getLength(); j++) {
            System* system = systems.get(j);
            system->handleMessage(&msg);
        }
    }
}

main.cpp

#include "EventSystem/MessageBus.h"

int main(int argc, char* argv[])
{
   MessageBus* msgBus = new MessageBus();
}

生成文件

CXX       := g++
CXX_FLAGS := -std=c++17 -ggdb

BIN     := bin
SRC     := src
INCLUDE := include

LIBRARIES   :=
EXECUTABLE  := main


all: $(BIN)/$(EXECUTABLE)

run: clean all
    clear
    ./$(BIN)/$(EXECUTABLE)

$(BIN)/$(EXECUTABLE): $(SRC)/*.cpp
    $(CXX) $(CXX_FLAGS) -I$(INCLUDE) $^ -o $@ $(LIBRARIES)

clean:
    -rm $(BIN)/*

但是当我尝试使用终端将这些文件编译在一起时:

g++ main.cpp EventSystem/MessageBus.cpp -o maintest

它工作得很好,所以我认为问题是我的文件没有编译在一起。我认为这可能与链接器无法找到正确的文件有关,也可能与我的项目结构有关? This is my current structure

如您所见,头文件与源代码位于一起。我应该将头文件与 cpp 文件分开,还是将它们放在子目录中?或者它完全是另外一回事?我对 c++ 和 Makefiles 有点陌生,我似乎无法理解导致问题的原因。

编辑:

解法:

正如@MadScientist 建议的那样,我将 Makefile 中的 $(SRC)/*.cpp 替换为 $(shell find $(SRC) -name \*.cpp -print),这解决了问题。但正如@WhozCraig 提到的,我可能应该切换到 cmake 以避免将来使用 Makefiles。

您将“工作”命令列为:

g++ main.cpp EventSystem/MessageBus.cpp -o maintest

但是你的食谱是:

$(BIN)/$(EXECUTABLE): $(SRC)/*.cpp

glob 表达式 $(SRC)/*.cpp 与文件 main.cpp 不匹配。

如果我们能看到您的 link 行,我们可能会发现缺少 main.cpp