Как разрешить неразрешенный символ?

Привет.

У меня проблема с динамическим связыванием моей библиотеки с моей программой. Вот что происходит: я разрабатываю модульную программу и тестирую модульную систему. Дело в том, что мои модули используют некоторый класс, который определен в основном двоичном файле: некоторые абстрактные классы, которые не вызывают проблем, и очень конкретный класс, который просто не может быть решен.

Я использую набор функций dlopen / dlsym / dlclose. И я компилирую, используя g++.

Дело в том, что если я попрошу dlopen загрузить все символы, это не даст мне ответа "undefined symbol: _ZNK3zia3api8DataTreecvRKSsEvНо если я запускаю dlopen в ленивом режиме, это произойдет только при первом использовании так называемого класса (и сразу после этого произойдет сбой).

Так что это класс "DataTree", и я хочу сделать его доступным как для основного двоичного файла, так и для модулей. Я уже пытался скомпилировать его в каждом из двоичных файлов: как я и ожидал, это не сработало. Я также пытался сделать его полностью встроенным, но это так же бесполезно, как и моя другая попытка. Я попытался скомпилировать основной двоичный файл с опцией "-rdynamic". Без изменений.

Со вчерашнего дня я искал, спрашивал друзей, но, похоже, никто не знает, как решить подобные проблемы.

Я компилирую объекты модуля с опцией -fPIC, например так:

g++ -Wall -fPIC -c mysource.cpp

И тогда я использую эту строку, чтобы сделать библиотеку:

g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so mysource.o

Я полагаю, что лучшим решением было бы не скомпилировать объект в библиотеке, а сделать символ доступным из основного двоичного файла. Итак, вопрос: как это сделать? (и это то, что я должен сделать?)

1 ответ

Попробуйте добавить -rdynamic чтобы модуль библиотеки не являлся основной программой, и убедитесь, что все ваши классы, которые имеют виртуальные методы и наследуются, имеют виртуальный деструктор. Еще одно предложение: сделайте минимальный пример и разместите его здесь.

Другие вопросы по тегам