atexit () не определено с автономным CLang

Я пытаюсь скомпилировать и связать некоторый код 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, пока не нужно включать стандартную библиотеку?

Большое спасибо заранее!

2

Решение

Для будущих посетителей, пользователь damvac смог выручить!

Вот мой комментарий о решаемой проблеме:

Кажется, я забыл добавить extern «C» к определению atexit (я только добавил его к объявлению), это, похоже, решило проблему! Спасибо всем, кто ответил, и спасибо davmac за предоставленное решение!

1

Другие решения

atexit (и вся концепция «выхода» в целом) не существует в автономной среде, поэтому вы не можете назвать это в своем коде.

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

0