2009-12-10 3 views
2

Я пытаюсь связать статически созданную библиотеку .a с другим фрагментом кода C.Символы статической библиотеки, отсутствующие в связанном исполняемом файле

Однако в последнем исполняемом файле несколько символов (имена функций) считаются отсутствующими, если они видны с помощью команды nm. Это связано с тем, что компоновщик (gcc) вызывается символами, на которые не ссылается другой фрагмент кода C, который связан с библиотекой. Символ функции, который я пытаюсь найти с помощью команды nm, отображается в библиотеке .a.

Как я могу заставить компоновщик не стирать символы, опущенные таким образом?

ответ

1

Как правило, компоновщик делает раздеть другие символы - в основном для

  • Уменьшить размер конечного исполняемого
  • ускорить выполнение программы

Есть два поезда мысли здесь:

  • Когда вы используете опцию -O как часть командной строки gcc, то есть o ptimizing код и, следовательно, вся информация отладки будет удалена, и, следовательно, компоновщик автоматически сделает то же самое.
  • Когда вы используете параметр -g как часть командной строки gcc, которая включает в себя всю информацию для отладки, чтобы исполняемый файл мог быть загружен под отладчиком с неповрежденными символами.

По существу эти два являются взаимоисключающими - вы не можете иметь оба комбинированных.

Так что это зависит от того, какие переключатели вы использовали для этого. Обычно переключатель -g предназначен для внутренней отладки и тестирования перед публичной версией. Противоположным было бы что-то вроде этого -O2, что делает компилятор достаточно умным, чтобы генерировать исполняемый файл, который будет считаться оптимизированным, например, удаление мертвых переменных, разворачивание циклов и т. Д.

Надеется, что это помогает и дает подсказку

+0

На самом деле, если я правильно помню, с компилятором Borland (думаю, это было 3.1 и 5.5), он жалуется на использование (было это?) Printf и связывание с плавающими точками, потому что нет никакого толчка в коде, чтобы заставить ссылку работа и обходной путь заключались в том, чтобы включить фиктивную функцию, которая ссылается на float ..может кто-то поддержать меня на этом? – t0mm13b

+0

Вы уверены? Обычно я использую -g и -O2, чтобы иметь отладочные символы даже в модуле выпуска. Это приводит к оптимизации модуля выпуска, но даже к символам, которые делают «основной файл» читаемым и полезным для последующей отладки. Я имею в виду: я не думаю, что они взаимоисключающие (я использую эти флаги годами ...), но я согласен, что это может быть расточительно, если не требуется. –

1

Обычно вам нужно вызвать некоторую функцию регистрации в приложении, чтобы генерировать такую ​​ссылку. Конечно, если у вас нет доступа к коду первой библиотеки, вы можете использовать опцию -g, как описано tommieb75.

Надеюсь, это поможет.

С уважением,

Sebastiaan

1

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

Может быть полезно для некоторых статических заводских шаблонов.

Смежные вопросы