ошибка компоновщика при компиляции отдельных файлов .h и. cpp - PullRequest
0 голосов
/ 09 апреля 2020

Как правильно это скомпилировать? минимальный код для демонстрации проблемы:

//main.cpp
#include "header.h"
#include <iostream>

using namespace std;
int main()
{
    auto z = myNameSpace::Complex(1, 2);
    cout << z << endl;
    return 0;
}
////////////////////////////////////////
//header.h
#pragma once
#include <iostream>
namespace myNameSpace
{
class Complex
{
public:
    int x;
    int y;

    Complex(int x, int y);
    friend std::ostream &operator<<(std::ostream &os, const Complex &a);
};
}
///////////////////////////////////
//header.cpp
#include "header.h"
using myNameSpace::Complex;
Complex::Complex(int x, int y) : x(x), y(y){};
std::ostream &operator<<(std::ostream &os, const Complex &a)
{
    os << a.x << "+i" << a.y;
    return os;
}

Я хочу использовать make для компиляции отдельных объектов и связывания их, что мне не хватает? Вот вывод моей команды make

$ make
g++    -c -o main.o main.cpp
g++    -c -o header.o header.cpp
g++ -o main.exe main.o header.o
main.o:main.cpp:(.text+0x33): undefined reference to `myNameSpace::operator<<(std::ostream&, myNameSpace::Complex const&)'
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:2: main.exe] Error 1

, а это мой файл make

main.exe: main.o header.o
    g++ -o main.exe main.o header.o

header.o: header.cpp header.h

main.o: main.cpp

.PHONY: clean
clean:
    rm *.o

1 Ответ

2 голосов
/ 09 апреля 2020

Я бы написал заголовок. cpp вот так

///////////////////////////////////
//header.cpp
#include "header.h"

namespace myNameSpace {

Complex::Complex(int x, int y) : x(x), y(y){}

std::ostream &operator<<(std::ostream &os, const Complex &a)
{
    os << a.x << "+i" << a.y;
    return os;
}

}

Наличие namespace myNameSpace { ... } вместо using myNameSpace ... - самый простой способ сделать все правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...