다음 몇 줄의 코드에서 내가 더 큰 프로젝트에서 경험했던 동작을 재현했습니다. 나는 가독성을 높이기 위해 #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] $^
시도 메인 애플리케이션을 컴파일하기 전에'make mklibs'를 만드시겠습니까? –