Отсутствуют символы из статической библиотеки в связанном исполняемом файле - PullRequest
5 голосов
/ 16 апреля 2011

У меня проблема со статическими символами библиотеки, пропущенными в связанном исполняемом файле. Вот описание моей проблемы:

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

  1. Набор функций и структур Си (несколько объектных файлов). Назовем соответствующие символы level1 символы.
  2. Набор классов-оболочек C ++ для этих функций и структур C (другой объектный файл). Назовем соответствующие символы level2 символы.
  3. Набор классов-оболочек C ++, унаследованных от классов 2-го уровня (другой объектный файл) с расширенными функциональными возможностями. Назовем соответствующие символы level3 символы.

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

Библиотека связана с исполняемым файлом. В этом файле напрямую использовались только символы level2 из lib. Но некоторым динамическим библиотекам, загружаемым этим исполняемым файлом во время выполнения, требуется level3 символов.

Проблема в том, что символы level3 по какой-то причине пропускаются в этом исполняемом файле (одобрено nm).

Сама библиотека содержит все группы символов. Также есть еще один исполняемый файл, связанный с этой библиотекой, который также содержит все группы символов. Основное различие между этими исполняемыми файлами состоит в том, что второй исполняемый файл (где представлены все символы) напрямую использует leve3 символов.

Весь проект собран с CMake в конфигурации отладки (это означает, что опция "-g" представлена ​​в командах g ++). Базовая ОС - GNU / Linux x86_64. g ++ версия 4.4.

Я проверил несколько похожих вопросов на StackOverflow, но не нашел приемлемого решения.

Я уже пробовал несколько вариантов компоновки для решения проблемы (--export-dynamic, --whole_archive), но ни одна из них не помогает.

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

Это командная строка, используемая для сборки исполняемого файла. Команда была сгенерирована CMake. Я только добавляю опцию --whole_archive, затем удаляю исполняемый файл и запускаю команду. Я также надеюсь, что вы извините меня за то, что я заменил все специфичные для проекта имена на «???».

exec_name - имя исполняемого файла, о котором мы говорим
lib_name - имя библиотеки, о которой мы говорим

/ usr / bin / c ++ - символическая ссылка на исполняемый файл g ++ v4.4

/ usr / bin / c ++ -Wextra -g -fPIC CMakeFiles / exec_dir.dir / main.cpp.o CMakeFiles / exec_dir.dir / options.cpp.o CMakeFiles / exec_dir.dir / runtime.cpp.o CMakeFiles / exec_dir.dir / plugins.cpp.o CMakeFiles / exec_dir.dir / CServer.cpp.o -o exec_name -rdynamic ../lib/???/lib???.a --whole-archive ../ .. /lib/???/???/lib_name.a ../lib/???/lib???.so ../../ lib / ??? / ??? / lib ???. a ../../???/???/lib???.a ../../lib/???/lib???.a -ldl -lboost_filesystem -lboost_signals -lboost_system -lboost_thread. ./../lib/???/lib???.so /usr/local/ssl/lib64/libcrypto.so -ldl -luuid -lodbc ../lib/log/lib???.so .. / lib / config / lib ??? -lpthread ../../???/???/lib???.a -Wl, -rpath, / home / beduin / ??? / build / deb / ??? / Библиотека / ???: / Главная / бедуин / ??? / сборки / Деб / Библиотека / ???: / USR / местные / SSL / lib64

1 Ответ

5 голосов
/ 16 апреля 2011

Используйте -rdynamic -Wl,-whole-archive <all your libs> -Wl,-no-whole-archive <boost, pthread and so on> - одна из ваших библиотек не в пределах --whole-archive

...