2017-10-24 8 views
0

아주 간단한 코드 스 니펫을 실행하려고합니다. 링커 오류가 발생했습니다. 내 코드는 다음과 같습니다간단한 C++ 코드 링커 오류

MAIN.CPP ->

#include <iostream> 
#include "Complex.h" 

using namespace std; 

int main() 
{ 
    Complex c1(1.0, 5.0); // this should create Complex object 1.0 + i5.0 
    return 0; 
} 

Complex.h ->

#include <iostream> 

class Complex { 
private: 
    double real; 
    double imaginary; 

public: 
    Complex(double, double); 
    void setReal(double); 
    void setImaginary(double); 

}; 

Complex.cpp ->

#include "Complex.h" 
#include <cmath> 

Complex::Complex(double x, double y) { 
    setReal(x); 
    setImaginary(y); 
} 
void Complex::setReal(double x) { 
    real = x; 
} 
void Complex::setImaginary(double x) { 
    imaginary = x; 
} 

오류가 발생했습니다. 다음과 같이 보입니다. Error photo

잠시 메인을 실행하려고했지만 링커 오류가 계속 발생합니다. 나는 그것을 일으키는 원인이 전혀 없다. 어떤 제안이라도 고맙게 생각합니다.

+1

'Complex.cpp' 파일을 컴파일하거나 링크하지 않습니다. –

답변

2

그냥

g++ main-3.cpp complex.cpp 

마음을 주 3 파일 이름을,이 질문에 일치하지 않습니다. g ++ 명령 줄에 사용중인 모든 cpp 파일을 입력하여 g ++에 헤더에 정의 된 함수의 코드가있는 위치를 알려줘야합니다. .o 파일을 읽고 정적 링크를 사용하고 그 의미를 이해하십시오.

  1. 읽기 .cpp 파일
  2. 과 함께 모든 #include 구문을 대체 : 여기

    는 moronically 간단한 내가 파일 포함 및 기타 요인

    C++ (또는 g ++를) 이해에 따라 약간의 가이드 라인이다 지정된 파일의 텍스트 (그냥 덤프)

  3. 결과 텍스트에 여전히 #include 지시어 (이제 헤더 파일의)가있는 경우 2 단계로 이동하십시오.
  4. Comp hughe 지저분한 blob을 '.o'오브젝트 파일에 넣고, 함수에 대한 호출을 기호로 바꾸고, 알려진 파일의 테이블과 정의 된 위치를 파일에 추가하십시오.
  5. .cpp 파일이 더 지정된 경우 새 빈 텍스트 Blob을 시작합니다.
  6. 모든 오브젝트 파일을 함께 링크하는 링커 'ld '를 호출하고 기호를 실제 주소로 바꿉니다.

엄밀히 말하면, 위는 약간 거짓말이며, 많은 부분이 생략되어 있으며 최적화는 언급되지 않았습니다. 하지만 여전히 컴파일러의 행동에 유용한 가이드입니다.

하여 오류를 해석하는 데 사용하려면 Complex.hmain.cpp#include을 통해, 당신의 덩어리로 덤프하지만 Complex.cpp하지 않았다되었다. g ++는

PUT 1.0 on Stack 
PUT 5.0 on Stack 
JUMP Complex::Complex 

의 라인을 따라 뭔가를 포함 당신을위한 내부의 임시 .o 인 파일을 생성 ... 그리고 링커 'ld'이 .o 인 파일로를 달렸다. ld 심볼 Complex :: Complex의 주소를 찾을 수 없습니다. 으로 이동하려면 메모리 주소가 필요합니다. Complex.cpp도 컴파일하면 결과 Complex가 생성됩니다.

Complex::Complex = 0xaaff 

링커 주어진 Complex.o 이제 어드레스와 main.o를 내의 심볼을 대체 할 수있다 : O, 예를 들어,이 항목을 갖는 심볼 테이블을 가질 것이다.

PUT 1.0 on Stack 
PUT 5.0 on Stack 
JUMP 0xaaff