2015-04-15 33 views
1

我有兩個類One和Two出現在兩個單獨的cpp文件中。的內容如下循環依賴庫的C++鏈接器順序

#include "One.h" 
#include "Two.h" 
namespace Sample 
{ 
    One::One() {} 
    void One::foo1() { 
    Two t; 
    t.foo(); 
    } 
    void One::foo()  {  } 
} 

和Two.cpp是

#include "Two.h" 
#include "One.h" 
namespace Sample { 
Two::Two() { } 
void Two::foo1() { 
    One t; 
    t.foo(); 
} 
void Two::foo() {} 
} 
使用

g++ -c One.cpp; ar cr libOne.a One.o; ranlib libOne.a 
g++ -c Two.cpp; ar cr libTwo.a One.o; ranlib libTwo.a 

對於主

創建的一個靜態庫和二,我調用兩者的各自foo1功能分類並編譯主要如下

g++ main.cpp -o main -L. -lOne -lTwo 

即使我更改One和Two的順序,代碼也會編譯。

我期待的代碼不應該編譯,除非我重複一,二的順序,因爲存在循環依賴。

可能是什麼原因?

我運行Ubuntu 14.04使用g ++版本4.8.2

回答

0

我期待的代碼不應該編譯

首先,你的代碼應該編譯,但可能無法鏈接。這些不同。

其次,您沒有顯示main.cpp的內容。如果它引用class One的任何方法,那麼你的代碼應該是鏈接正常。

要理解爲什麼,請閱讀thisthis