Я пытаюсь скомпилировать и связать некоторый код C ++, используя CLang, с помощью следующей командной строки:
clang.exe -nostdinc -MD -fno-use-cxa-atexit -fno-rtti -fno-exceptions -fsigned-char -fno-stack-protector -fPIC -m64 -Wall -Werror -Wno-unused-function -Wno-unused-label -Wno-ignored-attributes
(Я пропустил вывод, включает, определяет и т. Д. Это нормально)
У меня проблема в том, что во время ссылки я получаю сообщение об ошибке
error: L0039: reference to undefined symbol `atexit'
Я уже потратил довольно много времени на эту проблему, но, судя по всему, не могу понять, как правильно решить эту проблему.
Мои исследования показали, что atexit определяется в stdlib.h, но я не могу использовать стандартную библиотеку в этой ситуации (это не мое решение, и это абсолютно обязательно для этого конкретного проекта).
Насколько я могу судить, эта проблема возникает только сейчас из-за того, что у нас теперь внезапно появились статические объекты в нашем коде, который скомпилирован таким образом, что приводит к тому, что компилятор пытается зарегистрировать кон / деструкторы для этих объектов, которые требует звонка __cxa_atexit (который мы отключили, потому что он также давал неопределенные ссылочные ошибки по той же причине) или atexit.
Я также попытался определить произвольный atexit функция в моем коде, но, очевидно, компоновщик не хочет иметь с этим ничего общего (что мне кажется довольно странным).
Итак, у меня вопрос: как я могу заставить компоновщик не скулить atexit, пока не нужно включать стандартную библиотеку?
Большое спасибо заранее!
Для будущих посетителей, пользователь damvac смог выручить!
Вот мой комментарий о решаемой проблеме:
Кажется, я забыл добавить extern «C» к определению atexit (я только добавил его к объявлению), это, похоже, решило проблему! Спасибо всем, кто ответил, и спасибо davmac за предоставленное решение!
atexit
(и вся концепция «выхода» в целом) не существует в автономной среде, поэтому вы не можете назвать это в своем коде.
Чтобы компилятор не генерировал код поддержки, который его вызывает, вам нужно скомпилировать все ваши исходные файлы с -ffreestanding
чтобы указать, что вы используете / генерируете автономный код.