2013-04-11 10 views
5

大きなプロジェクトで経験した動作を以下のコード行で再現しました。私は可読性を向上させるために、#ifndefガードと#includeディレクティブを省略しました。リンカーエラーは、makeを呼び出すときに生成されます。メイクファイルは質問の最後に含まれています。リンクしている間に奇妙な未定義参照

クラス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&)' 

は、ここでソースコードです。できるだけ小さく、読みやすいようにしました。何が問題なの?ここで

/***** 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); 
} 

がメインです:

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

そして、ここでは、メイクファイルです:

%.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

これは間違いなくライブラリの名前から推測されます。 –