2013-04-11 4 views
5

다음 몇 줄의 코드에서 내가 더 큰 프로젝트에서 경험했던 동작을 재현했습니다. 나는 가독성을 높이기 위해 #ifndef 가드와 #include 지시어를 생략했습니다. 링커 오류는 make을 호출 할 때 생성됩니다. makefile은 질문 끝에 포함되어 있습니다.이상한 정의되지 않은 참조

클래스 C는 A에서 상속받은 B에서 상속받습니다. O는 완전히 다른 클래스입니다.

링커는 불평 :

g++ -o main main.cpp -L. -lABC -lO 
./libO.a(O.o): In function `O::foo(A)': 
O.cpp:(.text+0x1f): undefined reference to `C::C(A const&)' 

다음은 소스 코드입니다. 가능한 한 작고 읽기 쉽도록 노력했습니다. 어떤 생각이 어떤 문제입니까?

/******* main.cpp *******/ 
int main() 
{ 
    A a; 
    O o; 
    o.foo(a); 
    return 0; 
} 

그리고 여기 메이크 : 여기

/***** A.h *****/ 
class A 
{ 
    public: 
    A(); 
    A(const A& a); 
}; 

/***** A.cpp *****/ 
A::A() {} 
A::A(const A& a) {} 

/****** BC.h *******/ 
class B : public A 
{ 
    public: 
    B(const A& a); 
}; 

class C : public B 
{ 
    public: 
    C(const A& a); 
}; 

/******* BC.cpp ********/ 
B::B(const A& a) : A(a) {} 
C::C(const A& a) : B(a) {} 

/***** O.h *****/ 
class O 
{ 
    public: 
    void foo(A a); 
}; 

/***** O.cpp *****/ 
void O::foo(A a) 
{ 
    C c(a); 
} 

메인의

%.o: %.cpp %.h 
    g++ -c $< 

.PHONY: all 
all: mklibs main 

main: main.cpp 
    g++ -o [email protected] main.cpp -L. -lABC -lO 

mklibs: libABC.a libO.a 

libABC.a: A.o BC.o 
    ar -r [email protected] $^ 

libO.a: O.o 
    ar -r [email protected] $^ 
+0

시도 메인 애플리케이션을 컴파일하기 전에'make mklibs'를 만드시겠습니까? –

답변

3

일부 시간 링크 순서가 중요 할 수있다, 당신은 명시 적으로 호출하면 어떻게됩니까 -lO -lABC

+1

이것은 라이브러리의 이름에서 추측되는 것이 틀림 없습니다. –