Невозможная ошибка компоновщика - PullRequest
1 голос
/ 11 октября 2011

У меня есть библиотека, 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 */

base.cpp

#include "base.hpp"

производный.cpp

#include "derived.hpp"

void derived::foo()
{
}

Когда я пытаюсь использовать его в простой программе:

main.cpp

#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 (я пробовал на двух разных компьютерах).1028 * Я также попробовал Debian Wheezy amd64 с точно такой же версией компилятора : gcc (Debian 4.6.1-4) 4.6.1, и там все нормально связывается.

Что может быть не так?

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Вы забыли включить общую библиотеку во входы компоновщика при компоновке?

0 голосов
/ 11 октября 2011

Вы не можете связать только main.o без derived.o. Если первая виртуальная функция (или первая функция для класса без виртуальных функций направления) не связана, vtable не будет связана.

...