Ich reproduzierte das Verhalten, das ich in einem größeren Projekt in den folgenden paar Zeilen Code erlebt. Ich habe die #ifndef
Guards und die #include
Direktiven weggelassen, um die Lesbarkeit zu verbessern. Der Linker-Fehler wird beim Aufruf von make
erzeugt. Das Makefile ist am Ende der Frage enthalten.seltsame undefinierte Referenz beim Verknüpfen
Klasse C erbt von B, der von A erbt. O ist eine völlig andere Klasse.
Der Linker klagt:
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&)'
Hier ist der Quellcode. Ich habe versucht, es so klein und lesbar wie möglich zu machen. Irgendeine Idee, was ist das Problem?
/***** 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);
}
Hier ist der Haupt:
/******* main.cpp *******/
int main()
{
A a;
O o;
o.foo(a);
return 0;
}
Und hier ist der Make-Datei:
%.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] $^
Was passiert, wenn Sie explizit aufrufen 'make mklibs' vor dem Versuch, die Hauptanwendung zu kompilieren? –