¿Por qué g ++ todavía requiere -latomic
En29.5 Tipos atómicos del borrador de trabajo estándar de C ++ de noviembre de 2014 que dice:
Hay una plantilla de clase genérica atómica. El tipo de argumento de plantilla T será trivialmente copiable (3.9). [Nota: los argumentos de tipo que no son también inicializables estáticamente pueden ser difíciles de usar. —Final nota]Entonces, por lo que puedo decir, esto:
#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();
}
debe ser un código c ++ 14 estándar perfectamente válido (y también c ++ 11). Sin embargo, si no enlacelibatomic
manualmente, el comando
g++ -std=c++14 <filename>
da, al menos en Fedora 22 (gcc 5.1), el siguiente error de enlace:
/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
Si yo escribo
g++ -std=c++14 -latomic <filename>
todo esta bien. Sé que el estándar no dice nada sobre los indicadores del compilador o las bibliotecas que deben incluirse, pero hasta ahora pensé que cualquier código de archivo único y conforme al estándar puede compilarse mediante el primer comando.
Entonces, ¿por qué eso no se aplica a mi código de ejemplo? ¿Hay alguna razón racional?-latomic
¿Todavía es necesario, o es algo que aún no ha sido abordado por los encargados del compilador?