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

c未定义的引用

发布时间:2020-12-16 07:25:25 所属栏目:百科 来源:网络整理
导读:HI, 我对c / linux(ubuntu)中的.h文件和.cpp文件有一些疑问. 可以使用g编译.h文件,或者您可以编译包含.h文件的.cpp文件? 从.h文件和它的.cpp文件(.cpp,其中我包含一些代码到我在.h文件中定义的方法)我使用命令创建一个.so文件: g++-fPIC -shared my_code.c
HI,

我对c / linux(ubuntu)中的.h文件和.cpp文件有一些疑问.

>可以使用g编译.h文件,或者您可以编译包含.h文件的.cpp文件?
>从.h文件和它的.cpp文件(.cpp,其中我包含一些代码到我在.h文件中定义的方法)我使用命令创建一个.so文件:

g++-fPIC -shared my_code.cpp -o my_code.so`

在test.cpp中我包含.h文件并使用dlopen我在.so文件上创建一个处理程序.为什么我有以下错误:

undefined reference to bool `Class::method(std::string)` `collect2: ld returned 1 exit status

>如果我在.h文件中说虚拟bool方法…编译test.cpp时没有错误.有人可以解释我做错了什么吗?问题是我有一个模板.使用模板我不能使用virtual..so..i有这个未定义的错误,我不知道如何解决它.谢谢

编辑:

当我编译my_code.cpp时,我有错误:

/usr/bin/ld: .usr/lib/debug/usr/lib/crt1.o relocation 0 has invalid symbol index 12 (same with index 13,2,14...22 ).

但是当我创建.so文件时,没有错误.我用:

g++ test.coo -ldl -o test

用于test.cpp编译.

解决方法

>通常不需要编译.h文件,它只是生成一个扩展名为.gch的巨大文件.
>您获得的错误是链接时间.在创建.so文件时,实际上并不链接代码.因此,假定所有未定义的符号都出现在某个地方.链接它时,链接器将找到这些符号.因此,您应该将所有.cpp文件编译/链接在一起.错误将消失.

此外,对于模板,代码的定义必须始终可见.因此,无论何处编写模板化函数/变量定义,都要在任何地方包含该文件.

编辑:
您可以使用模板类的虚方法;但你不能拥有虚拟模板方法.

template<typename T>
class A {
  virtual void foo(int); // ok
};

class A {
  template<typename T>
  virtual void foo(T); // illegal
};

(编辑:李大同)

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

    推荐文章
      热点阅读