如果我注入一个依赖项,让它成为类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;
}
答案 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)......