Saya mencoba membangun proyek c++ dalam Kode VS tetapi ketika saya mencoba membangunnya, g++ melontarkan kesalahan yang mengatakan:

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.

Berikut adalah file yang menurut saya menyebabkan masalah:

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();
}

Makefile

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)/*

Tetapi ketika saya mencoba mengkompilasi file-file ini bersama menggunakan terminal:

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

Itu berfungsi dengan baik, jadi saya pikir masalahnya adalah file saya tidak dikompilasi bersama. Saya pikir ini mungkin ada hubungannya dengan tautan yang tidak dapat menemukan file yang benar dan mungkin ada hubungannya dengan struktur proyek saya? Ini adalah struktur saya saat ini

Seperti yang Anda lihat, file header terletak bersama dengan kode sumber. Haruskah saya memisahkan file header dari file cpp atau apakah saya telah meletakkannya di subdirektori? Atau itu sesuatu yang lain sama sekali? Saya agak baru di c++ dan Makefiles dan sepertinya saya tidak mengerti apa yang menyebabkan masalah.

Sunting:

Solusi:

Seperti yang disarankan @MadScientist, saya mengganti $(SRC)/*.cpp di Makefile saya dengan $(shell find $(SRC) -name \*.cpp -print) yang memecahkan masalah. Tetapi seperti yang disebutkan @WhozCraig, saya mungkin harus beralih ke cmake untuk menghindari Makefile di masa mendatang.

0
olbo98 13 Mei 2021, 14:46

1 menjawab

Jawaban Terbaik

Anda mencantumkan perintah "berfungsi" sebagai:

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

Tapi resepmu adalah:

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

Ekspresi glob $(SRC)/*.cpp tidak akan cocok dengan file main.cpp.

Jika kami dapat melihat baris tautan Anda, kami mungkin dapat melihat bahwa main.cpp tidak ada.

2
MadScientist 13 Mei 2021, 11:56