共享库中的依赖注入,lib是否需要目标文件?

时间:2016-10-01 14:11:37

标签: c++ linker

如果我注入一个依赖项,让它成为类A的实例,在共享库中定义的类B中,共享库是否需要类A的目标文件进行链接? (Meant是编译库后的g ++链接阶段,而不是运行时的OS链接)

实际上我在linux上试过这个,但事实并非如此。这适用于所有平台吗? (在这种情况下忽略符号可见性,除非必要)

A.H

#ifndef SOME_HEADERA_H
#define SOME_HEADERA_H
struct  A{
    void whoop();
};
#endif

a.cpp

#include <iostream>
#include "a.h"
void A::whoop (){
    std::cout << "A whooped."<< std::endl;
}

b.h

#ifndef SOME_HEADERB_H
#define SOME_HEADERB_H
class A;
struct  B {
    void whoopUsingA(A* a);
};
#endif

b.cpp

#include "b.h"
#include "a.h"
#include <iostream>
void B::whoopUsingA (A* a){
    std::cout << "B whoops A."<< std::endl;
    a->whoop();
}

的main.cpp

#include "a.h"
#include "b.h"
int main (int argc, const char* argv[]) {
    A a;
    B b;
    b.whoopUsingA(&a);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

答案不是&#34;是&#34;也不是&#34;不&#34;。

这里有三个目标文件:
B(来自b.cpp,成为共享库)
A(来自a.cpp,可执行程序的一部分)
Main(来自main.cpp,是程序的另一部分)

了解.h文件(至少在正常使用时)不会导致目标文件,这一点非常重要。在整个元组(一个cpp及其所有标题)成为一个目标文件之前,标题包含在Cpps中。

所以,现在在b.h中,你有class A;并想要使用这个类的对象。正如你所见,这还不够。你需要的是a.h文件。但你需要a.cpp和/或它的目标文件,单独的标题就足够了。

同样重要的是:
由于ABI等问题,如果出现以下情况,这可能不起作用:
a)对所有目标文件使用不同的编译器
b)您使用相同编译器的不同版本(某些组合起作用,其他组合起作用) c)某些特定的编译器标志对于所有目标文件都不相同 d)......