Как остановить Clang от дублирования функций в стандартных заголовочных файлах C? - PullRequest
8 голосов
/ 02 сентября 2011

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

/usr/include/bits/stdio.h:77: multiple definition of `putchar'
a2test.o:/usr/include/bits/stdio.h:77: first defined here

Что происходит, так это то, чтоЗаголовочный файл GNU libc для <stdio.h> объявляет определенные функции, включая putchar, равными extern __inline__, и по какой-то причине clang помещает определения в файлы .o.Затем, когда компоновщик видит дубликаты определений, он блеет.

Я подозреваю, что проблема в конфигурации: когда я использую clang 2.7, поставляемый с Debian lenny, все компилируется.Но для класса, который я преподаю, программное обеспечение должно работать на Red Hat Enterprise Linux 5, и мой системный администратор создал clang 2.7 из исходного кода.(Мы не используем 2.9, потому что мы не смогли заставить его скомпилировать hello world, и мы не используем более позднюю версию, потому что мы не смогли получить последнюю версию для сборки.)

Я ищуОбходной путь, который позволит мне скомпилировать.Либо опция командной строки, либо способ перенастроить clang, чтобы он не делал это плохо.

Я уже пробовал -U__USE_EXTERN_INLINES безрезультатно.

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

LLVM ошибка 5960 показывает, что эта проблема возникает из-за взаимодействия между поддержкой Clang C99 и старой версией GNU libc, установленной на RHEL 5. Похоже, что для тех из нас, кто придерживался RHEL 5, невозможно использовать clang -std=c99 -Ox для любого x > 0.

4 голосов
/ 03 сентября 2011

Try -std = gnu89; не совсем идеально, но в качестве обходного пути должен быть достаточно хорош.

...