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