Dou*_*oug 4 c++ gcc shared-libraries c++11
我一直在尝试使用std :: atomic进行编译,并且我得到了对__atomic_load,__ atomic_store和__atomic_store_16的未解析引用.
我知道在更高版本的gcc(4.8+?)中你包括-latomic,但是我用gcc编译4.7.3; 我已经尝试添加-latomic_ops和-latomic_ops_gpl,但似乎都没有做太多.
我现在正在安装gcc 4.8.1,但我确实有一个真正需要为4.7.3编译的发布平台.
非常感谢.
编辑:好的,这里有一些导致我遇到问题的代码:
atomics.cpp
#include <atomic>
#include <stdint.h>
struct dataStruct {
int a;
uint16_t b;
float c;
dataStruct(int ai, uint16_t bi, float ci) noexcept : a(ai), b(bi), c(ci) {
}
dataStruct() noexcept : dataStruct(0,0,0) {
}
};
int main() {
std::atomic<dataStruct> atomicValue;
atomicValue = dataStruct(10, 0, 0);
return atomicValue.load().b;
}
Run Code Online (Sandbox Code Playgroud)
使用"g ++ - 4.8.1*.cpp -std = c ++ 0x -latomic",这个编译很好.
使用"g ++ - 4.7.3*.cpp -std = c ++ 0x -pthread -lpthread -latomic_ops",它失败并显示以下内容:
/tmp/ccQp8MJ2.o: In function `std::atomic<dataStruct>::load(std::memory_order) const':
atomics.cpp:(.text._ZNKSt6atomicI10dataStructE4loadESt12memory_order[_ZNKSt6atomicI10dataStructE4loadESt12memory_order]+0x2f): undefined reference to `__atomic_load'
/tmp/ccQp8MJ2.o: In function `std::atomic<dataStruct>::store(dataStruct, std::memory_order)':
atomics.cpp:(.text._ZNSt6atomicI10dataStructE5storeES0_St12memory_order[_ZNSt6atomicI10dataStructE5storeES0_St12memory_order]+0x35): undefined reference to `__atomic_store'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
好的,终于找到了答案:https://gcc.gnu.org/wiki/Atomic/GCCMM
事实证明,4.7实际上并没有'官方'原子支持(只是头文件).如果要在4.7编译器中使用atomics,则必须下载该页面上链接的源代码并自行构建
gcc -c -o libatomic.o libatomic.c
ar rcs libatomic.a libatomic.o
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用它来构建它
g++-4.7.3 -std=c++0x atomics.cpp -latomic -L./
Run Code Online (Sandbox Code Playgroud)