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
};
点赞