В чем разница между clang и clang ++ при сборке библиотеки?

Я компилировал библиотеку c (для использования в проекте c ++) с помощью clang. У меня возникли ошибки компоновщика (в частности, неопределенный символ для функции hqxInit) при попытке связать эту библиотеку. Когда я переключаюсь на clang ++, он работает. Проверяя с помощью nm, clang ++ изменяет имена дальше. Что происходит - и есть ли лучший способ сообщить компоновщику, что библиотека munged-for-c, а не munged-for-c ++? Кажется глупым создавать библиотеку c с помощью c ++ ....

// построено с помощью clang

$ nm libhqx.a

libhqx.bak(init.c.o)
04000000 C _RGBtoYUV
00000004 C _YUV1
00000004 C _YUV2
00000000 T _hqxInit

// построено с помощью clang ++

$ nm libhqx.a 

libhqx.a(init.o):
00000100 S _RGBtoYUV
04000100 S _YUV1
04000104 S _YUV2
00000000 T __Z7hqxInitv

person Kaolin Fire    schedule 14.12.2012    source источник


Ответы (1)


clang и clang++ в большинстве систем являются одним и тем же исполняемым файлом. Одно - просто символическая ссылка на другой.

Программа проверяет, под каким именем она вызывается, и:

  • для clang компилирует код как C
  • для clang++ компилирует код как C ++

В C ++ компилятор генерирует имена для функций иначе, чем C - это потому, что у вас может быть несколько функций с одинаковыми именами (но разными) параметрами. Это называется «искажение имени» - и это то, что вы видите.

Вы можете использовать инструмент под названием c++filt, чтобы «распутать» имена.

Пример:

$ c++filt __Z7hqxInitv
hqxInit()

Дополнительная информация здесь: почему clang ++ ведет себя иначе, чем clang, если первое является символьной ссылкой на второе?

person Marshall Clow    schedule 14.12.2012
comment
Молодец, спасибо! искажение имен - отличный поисковый запрос для более глубокого изучения. - person Kaolin Fire; 15.12.2012
comment
Вы можете переопределить поведение автоопределения языка на основе имени исполняемого файла clang / clang ++, используя параметр командной строки --driver-mode. Например, clang --driver-mode=g++ должно быть эквивалентно clang++. - person Alex Klyubin; 01.02.2018