none
fatal error LNK1120 및 LNK2019 error.. 제발 도와주세요 ㅠㅠ RRS feed

  • 질문

  • 동적배열로 Vector의 기능을 따라해보고있는데,

    main에서 MyDoubleVector 객체 생성자 호출에서 아래와 같은 에러가 나타납니다..

    해당 에러와 관련한 모든 답안들을 시도해보았으나 해결되고 있지 않습니다.. 도움이 필요합니다.

    1>Project10.obj : error LNK2019: "public: __thiscall MyDoubleV::MyDoubleVector::MyDoubleVector(int)" (??0MyDoubleVector@MyDoubleV@@QAE@H@Z) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>Project10.obj : error LNK2019: "public: __thiscall MyDoubleV::MyDoubleVector::~MyDoubleVector(void)" (??1MyDoubleVector@MyDoubleV@@QAE@XZ) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>C:\Users\lee\source\repos\Project10\Debug\Project10.exe : fatal error LNK1120: 2개의 확인할 수 없는 외부 참조입니다.

    해당 에러로 빌드가 되질 않습니다.

    *P.S : std::copy(~) 함수를 활용하고있는데,  #if defined(_SCL_SECURE_NO_WARNINGS) 를 해주지 않으면 에러가 잡히더라구요 이점에 대해서도 무엇이 문제인지도 알려주시면 감사하겠습니다.

    소스는 아래와 같습니다



    //MyDoubleVector.h========================================

    #ifndef MyDoubleVector_H_
    #define MyDoubleVector_H_
    #include <cstdlib>


    namespace MyDoubleV {
    class MyDoubleVector {


    public:
    MyDoubleVector();
    MyDoubleVector(int capacity_value);
    MyDoubleVector(const MyDoubleVector& vector1);
    ~MyDoubleVector();

    void pop_back();
    void push_back(double x);
    size_t capacity() const;
    size_t size() const;
    void reserve(size_t n);
    bool empty() const;
    void clear();


    MyDoubleVector operator-();
    MyDoubleVector operator-(const MyDoubleVector& vector1);
    MyDoubleVector operator+(const MyDoubleVector& vector1);
    int operator*(const MyDoubleVector& vector1);
    MyDoubleVector operator+=(const MyDoubleVector& vector1);
    bool operator==(const MyDoubleVector& vector1);
    MyDoubleVector& operator=(const MyDoubleVector& vector1);
    MyDoubleVector operator()(int ChangeValue);
    double& operator[](int index);

    private:
    double *data; 
    size_t size_value;
    size_t capacity_value;
    };
    }
    #endif

    //===============================================

    //MyDoubleVector.cpp=========================================================

    #include "MyDoubleVector.h"
    #include <exception>
    #include <stdexcept>
    #include <assert.h>
    #if defined(_SCL_SECURE_NO_WARNINGS) 

    using namespace std;
    namespace MyDoubleV {


    MyDoubleVector::MyDoubleVector() {
    data = NULL;
    capacity_value = NULL;
    size_value = NULL;

    }

    MyDoubleVector::MyDoubleVector(int capacity_value) {
    this->data = new double[capacity_value];
    this->size_value = 0;
    this->capacity_value = capacity_value;

    }

    MyDoubleVector::MyDoubleVector(const MyDoubleVector& vector1) {
    this->data = new double[vector1.size_value];
    this->size_value = vector1.size_value;
    this->capacity_value = vector1.capacity_value;
    for (int i = 0; i < vector1.size_value; i++) {
    this->data[i] = vector1.data[i];
    }
    }

    MyDoubleVector::~MyDoubleVector() {
    delete this->data;
    }

    void MyDoubleVector::pop_back() {
    if (size() == 0)
    return;

    this->data[size() - 1] = NULL;
    --(this->size_value);
    }

    void MyDoubleVector::push_back(double x) {
    if (capacity() == size())
    reserve(capacity() + 10);

    this->data[size()] = x;
    this->size_value++;
    }
    size_t MyDoubleVector::capacity() const {
    return this->capacity_value;
    }
    size_t MyDoubleVector::size() const {
    return this->size_value;
    }
    void MyDoubleVector::reserve(size_t n) {

    if (this->capacity() == n)
    return;
    double *larger_array;
    larger_array = new double[n];
    //사이즈업
    if (this->capacity_value < n)
    {
    copy(data, data + size(), larger_array);
    delete[] data;
    data = larger_array;
    this->capacity_value = n;
    }
    //축소
    if (this->capacity_value > n) {
    int lowerNum = this->capacity_value - n;
    copy(data, data + lowerNum, larger_array);
    delete[] data;
    data = larger_array;
    this->capacity_value = n;
    }
    }
    bool MyDoubleVector::empty() const {
    if (this->size() == 0) {
    return true;
    }
    else
    return false;
    }
    void MyDoubleVector::clear() {
    delete this->data;
    }

    MyDoubleVector MyDoubleVector::operator-() {
    for (int i = 0; i < this->size(); i++) {
    this->data[i] = -this->data[i];
    }
    return *this;
    }
    MyDoubleVector MyDoubleVector::operator-(const MyDoubleVector& vector1) {
    assert(this->size() != vector1.size_value);

    for (int i = 0; i < this->size(); i++) {
    this->data[i] = this->data[i] - vector1.data[i];
    }
    return *this;

    }
    MyDoubleVector MyDoubleVector::operator+(const MyDoubleVector& vector1) {
    assert(this->size() != vector1.size_value);


    for (int i = 0; i < this->size(); i++) {
    this->data[i] = this->data[i] + vector1.data[i];
    }
    return *this;

    }
    int MyDoubleVector::operator*(const MyDoubleVector& vector1) {
    assert(this->size() != vector1.size_value);


    int temp = 0;
    for (int i = 0; i < this->size(); i++) {
    temp += vector1.data[i] * this->data[i];
    }
    return temp;

    }
    MyDoubleVector MyDoubleVector::operator+=(const MyDoubleVector& vector1) {
    assert(this->size() != vector1.size_value);

    for (int i = 0; i < this->size(); i++) {
    this->data[i] += vector1.data[i];
    }
    return *this;
    }
    bool MyDoubleVector::operator==(const MyDoubleVector& vector1) {
    assert(this->size() != vector1.size_value);

    for (int i = 0; i < this->size(); i++) {
    if (this->data[i] != vector1.data[i]) {
    return false;
    }
    return true;
    }
    }
    MyDoubleVector& MyDoubleVector::operator=(const MyDoubleVector& vector1) {
    if (this->capacity() != vector1.capacity_value) {
    double *new_data = new double[vector1.capacity_value];
    int used = vector1.size_value;
    copy(vector1.data, vector1.data + used, new_data);
    delete[] this->data;

    this->data = new_data;
    this->capacity_value = vector1.capacity_value;
    this->size_value = vector1.size_value;
    }
    return *this;
    }
    MyDoubleVector MyDoubleVector::operator()(int ChangeValue) {

    }
    double& MyDoubleVector::operator[](int index) {
    try {
    return data[index];
    }
    catch (exception& e) {
    throw out_of_range("Out of range!");
    }

    }
    }
    #endif

    //MyDoubleVector.cpp=========================================================


    • 편집됨 leehhhhhhh 2017년 10월 3일 화요일 오후 5:21
    2017년 10월 3일 화요일 오후 5:20

답변

  • 컴파일러에게 MyDoubleVector.cpp를 함께 컴파일하도록 시켰는지 검사해 보세요. 아무래도 그 파일이 컴파일 과정에서 누락된 것 같군요.

    std::copy문제는 다음의 글을 참고하세요.

    std::copy 등의 함수 사용 시 _SCL_SECURE_NO_WARNINGS 에러 발생
    ; http://www.sysnet.pe.kr/2/0/11317

    • 답변으로 표시됨 leehhhhhhh 2017년 10월 4일 수요일 오후 4:35
    2017년 10월 4일 수요일 오전 4:54

모든 응답

  • 컴파일러에게 MyDoubleVector.cpp를 함께 컴파일하도록 시켰는지 검사해 보세요. 아무래도 그 파일이 컴파일 과정에서 누락된 것 같군요.

    std::copy문제는 다음의 글을 참고하세요.

    std::copy 등의 함수 사용 시 _SCL_SECURE_NO_WARNINGS 에러 발생
    ; http://www.sysnet.pe.kr/2/0/11317

    • 답변으로 표시됨 leehhhhhhh 2017년 10월 4일 수요일 오후 4:35
    2017년 10월 4일 수요일 오전 4:54
  • 컴파일하도록 시켰는지 검사는 어떻게 하는건가요??
    2017년 10월 4일 수요일 오후 4:32
  • 컴파일러에게 MyDoubleVector.cpp 파일을 인자로 같이 줬다면 MyDoubleVector.obj 파일이 생성될 것입니다. 그리고 링크 과정에서 MyDoubleVector.obj 파일도 함께 넣어줘야 정상적인 .exe 파일이 생성됩니다.

    만약 Visual Studio를 사용하고 있다면 프로젝트에 MyDoubleVector.cpp 파일도 함께 넣어주면 됩니다.

    2017년 10월 5일 목요일 오후 1:58