C ++:如何使用彼此在其源代码中实现的方法来编译两个类?

时间:2019-02-12 17:49:45

标签: c++ compiler-errors root-framework

不重复!我有两节课。一个是:

// header A.h
#ifndef __A__
#define __A__

class B; // forward declaration

class A {
    public:
        A() { } 
        ~A() { }
        void LinkB(B* b = 0);
        Int_t Func1();
        Int_t Func2() {return 1;};

    protected:
        B* mB;
};
#endif

// source A.cxx
#include "A.h"
#include "B.h"
#include <iostream>

void A::LinkB(B* b) {
    this->mB = b;
    mB->LinkA(this);
    cout << mB->Func4();
}

Int_t A::Func1() {
    return 1;
}

和几乎相同的伙伴:

// header B.h
#ifndef __B__
#define __B__

class A; // forward declaration

class B {
    public:
        B() { } 
        ~B() { }
        void LinkA(A* a = 0);
        Int_t Func3();
        Int_t Func4() {return 1;};

    protected:
        A* mA;
};
#endif

// source B.cxx
#include "B.h"
#include "A.h"
#include <iostream>

void B::LinkA(A* a) {
    this->mA = a;
    cout << mA->Func2();
}

Int_t B::Func3() {
    return 1;
}

在宏中,我先编译B,然后编译A,然后使用在标题中声明和实现的Func2和Func4方法,一切正常。 但是,如果我切换到在源代码中实现的Func1和Func2 ,则我会收到编译错误,编译B。

I-TUnixSystem::ACLiC: creating shared library /home/./B.so
dlopen error: /home/./B_cxx.so: undefined symbol: _ZN9A14AFunc1Ev
Load Error: Failed to load Dynamic link library /home/./B_cxx.so

如果我切换顺序,即先编译B.cxx,然后编译A.cxx,则会得到类似的东西:未定义符号:_ZN9B10BLinkAEP9A

对于它的价值,我正在编译CERN ROOT框架以编译类。

任何想法我在做什么错/如何解决?非常感谢! 一种方法是在标头中将函数实现为内联(然后可以正常工作),但是我的函数非常冗长,将它们作为内联感觉不对。

编辑:

正如评论中所讨论的,这不是重复的,因为从一般c ++的角度来看代码是好的,并且可以用“常规” c ++编译器和链接器进行编译和链接,并且被root 6接受。根5的运行时库生成。

0 个答案:

没有答案