链接与g++未定义的引用

Linking with g++ undefined reference

本文关键字:引用 未定义 g++ 链接      更新时间:2023-10-16

我写了以下代码:

//--a.cpp--//
#include <stdio.h>
class A
{
public:
    void bar();
    virtual void foo()=0;
};
class B: public A
{
public:
    void foo()
    {
        A::bar();
    }
}
int main()
{
    B *b= new B();
    b->foo();
    return 0;
}
//--b.cpp--//
#include <stdio.h>
class A
{
public:
    void bar()
    {
        printf("class A");
    }
}

现在我编译和链接这些模块如下:

g++ -c a.cpp
g++ -c b.cpp
g++ -o bin a.o b.o

但是undefined reference error是由链接器提升的。我不明白,为什么?

未在a.cpp中定义A::bar()。在B::foo()中调用该方法,但它没有实现。因此链接器无法链接它。

b.cpp中,您创建了另一个类名A,但它与第一个无关。它不会在这里产生任何问题,但是如果您在第三个文件中包含任何一个文件到另一个文件或两个文件(尽管包含.cpp是不常见的),则会得到Redefinition Error。在一个翻译单元中,名称只能有一个定义。

通常的做法是在头文件(. hxx)中声明类,并在源文件(. cxx)中实现方法。如果你想让方法是 inlined,那么你可以在header中定义或显式地将方法声明为inline