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
。
我正在尝试在 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
。