具有循环依赖性的库的C ++链接器顺序

时间:2015-04-15 16:55:51

标签: linker g++ cyclic

我有两个类One和Two存在于两个单独的cpp文件中。内容如下

#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()  {}   
}   

我使用

创建了One和Two的静态库
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

对于main,我调用两个类的相应foo1函数并编译main如下

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

即使我改变了One和Two的顺序,代码也会编译。

我期待代码不应该编译,除非我重复一和二的顺序,因为存在循环依赖。

可能是什么原因?

我正在使用g ++版本4.8.2运行ubuntu 14.04

1 个答案:

答案 0 :(得分:0)

  

我期待代码不应该编译

首先,您的代码应该编译,但可能无法链接。这些是不同的。

其次,您没有显示main.cpp的内容。如果它引用了class One的任何方法,那么您的代码应该链接正常。

要了解原因,请阅读thisthis