смысл ошибки связывания C ++ во время выполнения? - PullRequest
2 голосов
/ 17 декабря 2010

Я получаю следующую ошибку во время выполнения.

anyfile.cpp (60): E_FATAL: не удалось начать процесс libprocbase_so.so (/Opt/company/processes/sharedbase_so.so: неопределенный символ: _ZTV16CResourceManager)

Я обнаружил, что значение _ZTV16CResourceManager - это виртуальная таблица Resource Manager,

Есть идеи, почему это происходит? как это решить?

Ответы [ 2 ]

5 голосов
/ 17 декабря 2010

Проблема в том, что при загрузке динамических библиотек (sharedbase_so.so) он не смог разрешить символ.Попробуйте найти, в какой библиотеке (если есть) символ определен, и убедитесь, что ld может его загрузить (добавить его в путь).Если он отсутствует в какой-либо динамической библиотеке, вернитесь к объектным файлам и попытайтесь определить, где он находится и почему он не попал в двоичный файл.

Распространенной ситуацией, когда это может быть проблемой, являетсяс классами, которые в основном определены как встроенные, например:

struct test {
   virtual void foo() {}
   //virtual void bar();
};

Если строка с bar закомментирована, то компилятор сгенерирует виртуальную таблицу как слабый символ во всех единицах перевода, которые его включают.Если bar не закомментировано, компилятор не будет генерировать vtable в каждой единице перевода, а только в той единице перевода, которая определяет test::bar.Убедитесь, что даже если вы не используете test::bar, объектный файл будет связан в библиотеке.

1 голос
/ 17 декабря 2010

Где вы объявили класс ResourceManager?

Кажется, что эта библиотека не загружена - когда вы используете связывание во время выполнения, вы должны вручную загрузить все зависимости в правильном порядке.

...