Вопрос по stdatomic, c++11, g++, libstdc++, c++ – Почему g ++ все еще требует -latomic

11

В29.5 Атомные типы рабочего проекта стандарта C ++ от ноября 2014 г.

Существует универсальный шаблон класса atomic. Тип аргумента шаблона T должен быть тривиально копируемым (3.9). [Примечание: аргументы типа, которые также не являются статически инициализируемыми, могут быть сложны в использовании. —Конечная записка]

Итак, насколько я могу судить, это:

#include <atomic>

struct Message {
    unsigned long int a;
    unsigned long int b;
};

std::atomic<Message> sharedState;

int main() {    
    Message tmp{1,2};       
    sharedState.store(tmp);         
    Message tmp2=sharedState.load();
}

должен быть совершенно корректный стандартный код c ++ 14 (а также c ++ 11). Однако, если я не буду ссылатьсяlibatomic вручную, команда

g++ -std=c++14 <filename>

дает - по крайней мере на Fedora 22 (gcc 5.1) - следующую ошибку компоновки:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status

Если я напишу

g++ -std=c++14 -latomic <filename>

Все отлично. Я знаю, что стандарт ничего не говорит о флагах компилятора или библиотеках, которые должны быть включены, но до сих пор я думал, что любой стандартный, совместимый код одного файла можно скомпилировать с помощью первой команды.

Так почему же это не относится к моему примеру кода? Есть ли рациональная причина?-latomic все еще необходимо, или это просто что-то, что еще не было решено разработчиками компилятора?

Ваш Ответ

3   ответа
0

g++ это обертка дляgcc который добавляет правильные библиотеки C ++. очевидно-latomic отсутствует в этом списке. Тогда проблема не в основном компиляторе, просто незначительная ошибка в оболочке.

g++ являетсяне "Обертка дляgccMsgstr "Они больше похожи на братьев и сестер, оба обертывают различные фактические компиляторы (например,cc1plus). Lightness Races in Orbit
Это вполне может быть осознанное решение, поскольку оно еще не полностью реализовано. Особенно29.3 Порядок и последовательность Поддержка указана как Частичная.gcc.gnu.org/onlinedocs/libstdc++/manual/... Captain Giraffe
1

что стандарт ничего не говорит о флагах компилятора или библиотеках, которые должны быть включены

Правильно.

но до сих пор я думал, что любой стандартный, единый код файла может быть скомпилирован с помощью первой команды.

Ну нет. Как и тыпросто сказал, что нет особых оснований предполагать это. Также учтите, что расширения GCC включены по умолчанию.

При этом кажется очевидным, что намерение состоит в том, чтобы-latomic часть по умолчанию среды выполнения, когда она немного успокоилась.

@MikeMB: О, это возможно. Lightness Races in Orbit
Очевидно, я не делал этого предположения, основываясь на чем-то, что написано в стандарте, но основываясь на моем (несколько ограниченном) опыте работы с g ++. Также поправьте меня, если я ошибаюсь, но не-std=c++11 отключить g ++ конкретные расширения? MikeMB
5

Актуальное чтение на домашней странице GCC о том, как и почему GCC осуществляет библиотечные звонки в определенных случаях, касающихся<atomic> на первом месте.

GCC и libstdc ++ только плохо связаны.libatomic это домен библиотеки, а не компилятор - и вы можете использовать GCC с другой библиотекой (которая может предоставить необходимые определения для<atomic> в своем основном собственно, или под другим именем), поэтому GCC не может простопредполагать -latomic.

Также:

GCC 4.7 не включает библиотечную реализацию, так как API не был твердо установлен.

На той же странице утверждается, что GCC 4.8 должен обеспечить такую ​​реализацию библиотеки, но планы являются первыми жертвами войны. Я предполагаю причину-latomic по-прежнему необходимо найти в этом районе.

Кроме того...

... до сих пор я думал, что любой стандартный, единый код файла может быть скомпилирован с помощью первой команды.

...-lm был вокруг в течение достаточно долгого времени, если вы используете математические функции.

Я давно не использовал gcc, но для g ++ -lm не нужен, не так ли? MikeMB
Обратите внимание, что стандарт C ++ несколько неоднозначен, является ли библиотека отдельным компонентом - разделы библиотеки довольно автономны, но «реализация» в стандарте означает сочетание компилятора и библиотеки. MSalters
@MikeMB: не могу сказать (в отношении-lm) потому что я не использовал<math> в течение долгого времени. ;-) DevSolar
Кстати: ваша цитата о gcc 4.7 была причиной, по которой я спрашивал, почему это все-таки необходимо в GCC 5.1. MikeMB

Похожие вопросы