Я использую g ++ 4.4 для компиляции общей библиотеки на Linux. Я хотел бы использовать некоторые функции C ++ 11, если могу, в библиотеке, но я не могу обновить версию компилятора или требовать каких-либо специальных переключателей компилятора для пользователей моей библиотеки.
У меня есть два вопроса, и я не могу найти окончательный ответ.
Если я скомпилирую разделяемую библиотеку с -std = c ++ 0x или -std = g ++ 0x, я гарантирую, что программе, использующей мою библиотеку, эти переключатели не нужны (при условии, что у меня нет функций c ++ 0x в файлы заголовков)? Кажется, это работает, но я не хочу подписываться на тонкие проблемы в будущем.
Стандартная библиотека для C ++ 11 в g ++ 4.4 довольно неполна. Поскольку большая часть стандартной библиотеки предназначена только для заголовков, а файлы заголовков gnu, как правило, заполнены версией ifdefs, я думаю, что может быть способ использовать более позднюю версию, по крайней мере, файлов заголовков в libstdc ++. Я не могу использовать другой .so для этого, хотя. Я уверен, что смогу сделать это вместе, но возможно ли сделать что-то подобное правильно?
Благодарю.
1. Если я скомпилирую разделяемую библиотеку с -std = c ++ 0x или -std = g ++ 0x, я гарантирую, что программе, использующей мою библиотеку, эти переключатели не нужны (при условии, что у меня нет c ++ 0x особенности в заголовочных файлах)? Кажется, это работает, но я не хочу подписываться на тонкие проблемы в будущем.
Поддержка C ++ 11 все еще была экспериментальной в выпусках GCC 4.x (она больше не является экспериментальной, начиная с GCC 5 и далее). Несмотря на то, что мы постарались сохранить работоспособность, ответ — нет, но вы не гарантируете, что это сработает во всех случаях. Есть ряд изменений ABI, вызванных использованием -std=c++0x
это может вызвать проблемы для программ, которые смешивают код C ++ 03 и код C ++ 11, см. http://gcc.gnu.org/wiki/Cxx11AbiCompatibility Больше подробностей. Если ваша библиотека не экспортирует какие-либо символы, описанные на этой странице, то все будет в порядке.
2. Стандартная библиотека для C ++ 11 в g ++ 4.4 довольно неполна. Поскольку большая часть стандартной библиотеки предназначена только для заголовков, а файлы заголовков gnu, как правило, заполнены версией ifdefs, я думаю, что может быть способ использовать более позднюю версию, по крайней мере, файлов заголовков в libstdc ++. Я не могу использовать другой .so для этого, хотя. Я уверен, что смогу сделать это вместе, но возможно ли сделать что-то подобное правильно?
Нет, абсолютно никаких шансов, что это сработает. Заголовки из более поздних версий используют функции, не поддерживаемые 4.4, и даже если вы могли бы использовать их, вам нужно будет использовать более новые libstdc++.so
, Просто нет.
Заголовки не полная версия #ifdefs
почти единственные, что вы найдете, это чеки на __GXX_EXPERIMENTAL_CXX0X__
который определяется G ++ при использовании -std=c++0x
но это не означает, что ваша версия 4.4 поддерживает лямбды, нестатические инициализаторы элементов данных, правильную семантику ссылочных значений, функции по умолчанию / удаленные и т. д., которые более поздние заголовки широко используют. Вы должен используйте заголовки libstdc ++ с той же версией GCC, с которой они пришли.
Короче говоря, если вам нужна правильная поддержка C ++ 11, вам нужно использовать более новый компилятор.
Если вы не можете использовать более новый компилятор, вы не сможете получить надлежащую поддержку C ++ 11.
Я бы не стал это пробовать. Все, что требуется, — это один определенный в заголовке C ++ 11 макрос для изменения определения класса или функции, и ваш конечный пользователь будет нарушать правило одного определения. Я думаю, что это может быть очень тонким.
А затем на аналогичной ноте, есть vector(count, item = T())
конструктор, которого больше нет в C ++ 11 (теперь это два конструктора).
Короче говоря, вы должны быть очень осторожны с тем, какие стандартные компоненты библиотеки вы использовали в своей библиотеке, чтобы не нарушать одно правило определения, и я не могу себе представить, что риск поломки стоит использовать эти функции.
Что ты Можно сделать это использовать boost
а также tr1
заполнять языковые пробелы до тех пор, пока вы не сможете использовать новый компилятор и / или не сможете потребовать от ваших конечных пользователей компиляции с поддержкой C ++ 11.