2014-01-02 4 views
6

У меня есть мой проект, который сейчас компилируется под gcc. Он использует Boost, ZeroMQ как статические библиотеки .a и некоторые библиотеки .so, такие как SDL. Я хочу идти, но не сейчас. Интересно, можно ли скомпилировать код, который использует .a и .so библиотеки, которые были скомпилированы под gcc с clang?Может ли компилировать код Clang с GCC скомпилированными .a libs?

ответ

9

Да, вы обычно можно использовать clang с GCC скомпилированные библиотеки (и наоборот, использовать gcc с лязгом скомпилированных библиотек), потому что на самом деле это не компиляцией, но linking, которая имеет отношение. Вам может быть не повезло и получить неприятные сюрпризы.

В принципе вы можете иметь некоторые зависимости от версии libstdc++, используемой для связывания соответствующих библиотек (если они закодированы на C++). Собственно, это обычно не имеет большого значения.

В C++ name mangling теоретически может быть проблемой (могут быть некоторые угловые случаи, даже несовместимости между двумя разными версиями g++). Опять же, на практике это обычно не проблема.

Как правило, вы можете смешивать CLANG (даже разные, но близкие версии) с GCC, но у вас могут быть неприятные сюрпризы. То, что следует ожидать от любого компилятора C++ (будь то CLANG или GCC), - это просто возможность компилировать и связывать все программное обеспечение (и все библиотеки) вместе, используя тот же компилятор и версию. Вот почему обновление компилятора в дистрибутиве - это большая работа: производители должны убедиться, что все пакеты скомпилированы (и они действительно удивляют!).

+1

Не упоминая о каких-то неприятных сюрпризах, вы выглядите как сотрудник Apple. –

+0

Я не был и никогда не был сотрудником Apple. Вы можете найти информацию обо мне на http://starynkevitch.net/Basile/; Я вношу свой вклад в GCC (и работаю над [MELT] (http://gcc-melt.org/) ...) –

+0

Жаль, мужик! RMS тоже не цветок))) –

2

По крайней мере, для Crypto++ library это не работает (проверено :-() Так что для кода на C++ это менее вероятно, будет работать, в то время как чистый с код, вероятно, связать OK

EDIT:.. Проблема начала появляться с Mac OS X 10.9 Mavericks и Xcode-5, которые переключили стандартную C++-библиотеку для clang из libstdC++ в libC++. Она не существовала в Mac OS X 10.8 и более ранних версиях.

Решение выглядит следующим образом: если вам нужно скомпилировать C++-код с clang и связать его с gcc-скомпилированной библиотекой, используйте «clang ++ -stdlib = libstdC++». Связывание выполняется успешно, и результирующий двоичный файл выполняется правильно.

CAVEAT: похоже, что это не так: даже если вы можете собрать библиотеку, скомпилированную с помощью «clang ++ -stdlib = libstdC++» и связать с ней код gcc-скомпилированный код, этот код будет сбой с помощью SEGV. До сих пор я нашел, что единственный способ связать с clang-compiled библиотекой - это компиляция вашего кода с помощью clang, а не gcc.

+0

На самом деле libvpx может быть скомпилирован с gcc, а затем связан со стандартным LLVM-компилятором Objective-C. Вещь, в которой вы нуждаетесь, - это статическая ссылка с их libstdC++/libC++. Это не является неприемлемым - в то время как вы не меняете данные malloc'ed, он будет работать нормально! Но кто сейчас меняет динамические данные между библиотеками? :-) –

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