【问题标题】:Dependency injection in shared library, does the lib need object files?共享库中的依赖注入,库是否需要目标文件?
【发布时间】:2016-10-01 14:11:37
【问题描述】:

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

实际上我在 linux 上试过了,但没有。所有平台都是这样吗? (在这种情况下忽略符号可见性,除非必要)

啊。

#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;
}

【问题讨论】:

    标签: c++ linker


    【解决方案1】:

    答案既不是“是”也不是“不是”。

    这里有三个目标文件:
    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) ...

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2018-07-14
      相关资源
      最近更新 更多