我有一个库libfoo
,它由以下文件组成:
base.hpp
#ifndef BASE_HPP
#define BASE_HPP
class base
{
public:
virtual ~base();
virtual void foo() = 0;
};
inline base::~base() {}
#endif /* BASE_HPP */
derived.hpp
#ifndef DERIVED_HPP
#define DERIVED_HPP
#include "base.hpp"
class derived : public base
{
public:
void foo();
};
#endif /* DERIVED_HPP */
#include "base.hpp"
#include "derived.hpp"
void derived::foo()
{
}
当我尝试在一个简单的程序中使用它时:
#include <derived.hpp>
int main()
{
derived d;
return 0;
}
我收到以下链接器错误:
scons -Q -C libfoo
scons: Entering directory `/home/ereon/git_work/box/libfoo'
g++ -o base.os -c -fPIC base.cpp
g++ -o derived.os -c -fPIC derived.cpp
g++ -o libfoo.so -shared base.os derived.os
scons -Q -C bar
scons: Entering directory `/home/ereon/git_work/box/bar'
g++ -o main.o -c -I/home/ereon/git_work/box/libfoo main.cpp
g++ -o bar main.o
main.o: In function `derived::derived()':
main.cpp:(.text._ZN7derivedC2Ev[_ZN7derivedC5Ev]+0x1f): undefined reference to `vtable for derived'
main.o: In function `derived::~derived()':
main.cpp:(.text._ZN7derivedD2Ev[_ZN7derivedD5Ev]+0x13): undefined reference to `vtable for derived'
collect2: ld returned 1
scons: *** [bar] Error 1
make: *** [all] Erreur 2
现在有趣的是,我只在Debian Wheezy x86_64
计算机上遇到此错误(我在两台不同的计算机上试过)。
我还尝试使用完全相同的编译器版本:amd64
来使用Debian Wheezy gcc (Debian 4.6.1-4) 4.6.1
并在那里链接正常。
可能出现什么问题?
答案 0 :(得分:2)
您在链接时忽略了在链接器输入中包含共享库吗?
答案 1 :(得分:0)
您也不能仅在main.o
之后链接derived.o
。除非链接了第一个虚函数(或没有方向虚函数的类的第一个函数),否则vtable
将不会被链接。