2016-08-14 2 views
0

Ubuntu 16.04 поставляется с GCC 5.4, который поддерживает C++ 11, и это компилятор по умолчанию. По умолчанию C++ 11 не включен в этой конкретной версии GCC.C++ libs от ubuntu 16.04 repo - параметры компилятора

Я намерен использовать некоторые из двоичных библиотек (не только заголовков) из своего репозитория (например, boost). В моих проектах я включу C++ 11.

Как были скомпилированы библиотеки C++ из репозитория? Можно ли использовать их с включенным C++ 11? Я знаю, что библиотеки C++ можно вызывать с разных языков (Java, Pythons, C# и т. Д.), Скрывая все компоненты C++ за простым интерфейсом C. С усилением это не случай. Если какая-то функция возвращает мне строку или вектор или что-нибудь из STL, это проблема. Бинарное представление объектов AFAIK STL зависит от флагов компилятора (например, std = C++ 11).

спасибо.

+1

'g ++ -v' покажет вам, как он был скомпилирован. – SurvivalMachine

+2

AFAIK вы можете вызывать библиотеку C++ из кода C++ 11 и C++ 14, даже если библиотека не скомпилирована с C++ 11. – fstamour

+0

C++ в основном совместим по этой причине, насколько мне известно. – Charles

ответ

2

В каких именно библиотеках вы говорите?

Если вы говорите о стандартной библиотеке, то libstdc++ является частью gcc. Всегда удобно связывать его независимо от того, какой стандарт вы компилируете. gcc также принял решение о включении тегов ABI, чтобы они могли быть совместимыми с ABI с кодом, скомпилированным на C++ 11 и pre C++ 11. Смотрите действительно хороший ответ экземпляра TC на вопрос, я спросил здесь:

Is this simple C++ program using <locale> correct?

Если по

Как были C++ библиотеки из хранилища компилируется?

Вы имеете в виду, как скомпилированы все библиотеки C++ в репозиториях ubuntu, ответ может быть различным для каждого из них.

Например, если вы хотите использовать libfreetype6-dev или libsdl2-dev, это библиотеки C, они будут в порядке, чтобы ссылаться на какой бы стандарт вы ни нацелились.

Если вы хотите использовать libsilly-dev от CEGUI, то есть библиотеки C++, и обычно лучше всего использовать тот же самый компилятор для вашего проекта и C++ lib, с которым вы связываетесь. Если он появляется в репозитории ubuntu, вы можете предположить, что он был построен по умолчанию с версией g++, которую отправляет ubuntu. Если вам нужно использовать другой компилятор, вероятно, лучше всего создать C++ lib - в общем, C++ не стабилен ABI для разных компиляторов или даже для разных версий одного и того же компилятора.

Если вы хотите использовать скомпилированные библиотеки boost, то, вероятно, лучше всего использовать библиотеки, которые они вам дают, и использовать компилятор, который они вам дают. Если вы используете только boost-only boost, тогда компилятор не имеет значения, так как вам не нужно связываться с чем-то, что они построили. Поэтому у вас больше гибкости в отношении компиляторов.

Часто, если вам нужно использовать библиотеки C++, лучше всего интегрировать их систему сборки в вашу, чтобы ее можно было легко перестроить из исходного кода, и вам нужно только настроить компилятор один раз. (По крайней мере, по моему опыту.) Это может сэкономить много времени, когда вы решите обновить компиляторы позже. Если вы используете cmake, то это часто возможно, но иногда это может быть сложно, особенно если у вас много зависимостей на C++. Если вы не используете cmake, ну, многие библиотеки используют cmake, и это будет не так просто интегрировать их таким образом.cmake все равно будет больно, так что это может быть не такая потеря.

+0

Похоже, мой вопрос был не ясен. Я обновил его. –

+0

@quantum_well: Я думаю, вы должны внимательно прочитать ответ T.C. в другом вопросе. В принципе, говорит «clang», вы сами по себе. Если вы хотите использовать 'clang', вы должны скомпилировать весь код по тому же стандарту, и вы не должны ссылаться на' boost' в вашем репозитории ubuntu - вы должны скомпилировать его самостоятельно afaik. Как вы говорите, если вы вернетесь к 'std :: string', вы попадете в проблему, даже если вы просто связываетесь с libstdC++. В 'gcc' они имеют атрибут тега ABI, поэтому C++ 98 std :: string и C++ 11 std :: string могут сосуществовать в одной и той же программе. –

+0

Если вы занимаетесь кросс-платформенной разработкой, то есть планируете использовать gcc, clang, mingw, я бы рекомендовал всегда компилировать boost самостоятельно или использовать только boost-only boost. Idk, может быть, я новичок, но таким образом у меня гораздо больше уверенности, когда я распространяю код. –

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