加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 链接时奇怪的未定义引用

发布时间:2020-12-16 05:04:16 所属栏目:百科 来源:网络整理
导读:我在以下几行代码中重现了我在一个更大的项目中所经历的行为.我遗漏了#ifndef守卫和#include指令,试图提高可读性.调用make时会产生链接器错误. makefile包含在问题的末尾. C类继承自B的继承自A的O.O是完全不同的类. 链接器抱怨: g++ -o main main.cpp -L. -
我在以下几行代码中重现了我在一个更大的项目中所经历的行为.我遗漏了#ifndef守卫和#include指令,试图提高可读性.调用make时会产生链接器错误. makefile包含在问题的末尾.

C类继承自B的继承自A的O.O是完全不同的类.

链接器抱怨:

g++ -o main main.cpp -L. -lABC -lO
./libO.a(O.o): In function `O::foo(A)':
O.cpp:(.text+0x1f): undefined reference to `C::C(A const&)'

这是源代码.我试图让它尽可能小和可读.知道问题是什么?

/***** A.h *****/
class A
{
    public:
    A();
    A(const A& a);
};

/***** A.cpp *****/
A::A() {}
A::A(const A& a) {}

/****** BC.h *******/
class B : public A
{
    public:
    B(const A& a);
};

class C :  public B 
{
    public:
    C(const A& a);
};

/******* BC.cpp ********/
B::B(const A& a) : A(a) {}
C::C(const A& a) : B(a) {}

/***** O.h *****/
class O
{
    public:
    void foo(A a);
};

/***** O.cpp *****/
void O::foo(A a)
{
    C c(a);
}

这是主要的:

/******* main.cpp *******/
int main()
{
    A a;
    O o;
    o.foo(a);
    return 0;
}

这是makefile:

%.o: %.cpp %.h
    g++ -c $<

.PHONY: all
all: mklibs main

main: main.cpp
    g++ -o $@ main.cpp -L. -lABC -lO

mklibs: libABC.a libO.a

libABC.a: A.o BC.o
    ar -r $@ $^

libO.a: O.o
    ar -r $@ $^

解决方法

有时链接顺序很重要,请尝试-lO -lABC

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读