尝试编译队列时static_initialization_and_destruction错误
static_initialization_and_destruction error on trying to compile a queue
我正在尝试实现一个阅读器队列。
我的头文件如下所示:
#ifndef CIRCULARSPSC_H
#define CIRCULARSPSC_H
#include <atomic>
#include <cstddef>
template<typename Data, size_t Size>
class CircularSpsc
{
public:
enum { queue_size = Size + 1 };
CircularSpsc() : back(0), front(0){}
virtual ~CircularSpsc() {}
bool push_back(const Data& item);
bool pop_front(Data& item);
bool isEmpty() const;
bool isFull() const;
private:
size_t increment(size_t idx) const;
std::atomic<size_t> back;
Data dataArray[queue_size];
std::atomic<size_t> front;
};
#endif
这是我的源文件:
#include <circularspsc.h>
template<typename Data, size_t Size>
bool CircularSpsc<Data, Size>::push_back(const Data& item)
{
const auto current_back = back.load(std::memory_order_relaxed);
const auto next_back = increment(current_back);
if(next_back != front.load(std::memory_order_acquire))
{
dataArray[current_back] = item;
back.store(next_back, std::memory_order_release);
return true;
}
return false;
}
template<typename Data, size_t Size>
bool CircularSpsc<Data, Size>::pop_front(Data& item)
{
const auto currentfront = front.load(std::memory_order_relaxed);
if(currentfront == back.load(std::memory_order_acquire))
return false;
item = dataArray[currentfront];
front.store(increment(currentfront), std::memory_order_release);
return true;
}
template<typename Data, size_t Size>
bool CircularSpsc<Data, Size>::isEmpty() const
{
return (front.load() == back.load());
}
template<typename Data, size_t Size>
bool CircularSpsc<Data, Size>::isFull() const
{
const auto nextback = increment(back.load());
return (nextback == front.load());
}
template<typename Data, size_t Size>
size_t CircularSpsc<Data, Size>::increment(size_t idx) const
{
return (idx + 1) % queue_size;
}
在我的主文件中,当我尝试创建上面实现的队列实例时,如下所示:
#include <iostream>
#include "circularspsc.h"
int main()
{
CircularSpsc<bool, 100000> cspsc_q;
}
我收到以下错误:
/tmp/ccQFNFP5.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x53): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x62): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccQFNFP5.o: In function `circular_spsc_relaxed::CircularSpsc<bool, 100000ul>::~CircularSpsc()':
main.cpp:(.text._ZN21circular_spsc_relaxed12CircularSpscIbLm100000EED0Ev[_ZN21circular_spsc_relaxed12CircularSpscIbLm100000EED5Ev]+0x20): undefined reference to `operator delete(void*)'
/tmp/ccQFNFP5.o:(.rodata._ZTIN21circular_spsc_relaxed12CircularSpscIbLm100000EEE[_ZTIN21circular_spsc_relaxed12CircularSpscIbLm100000EEE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
collect2: error: ld returned 1 exit status
如果我从队列实现中删除虚拟析构函数,我仍然会收到以下两个错误:
`__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x53): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x62): undefined reference to `std::ios_base::Init::~Init()'
我正在编译:
gcc -std=c++11 -o testQueue circularspsc.cpp main.cpp
你需要用 g++ 而不是 gcc 编译
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- C++如何通过"constructor initialization"初始化行变量?
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- C++ CRTP initialization
- std::visit and std::variant usage
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- [conv]/6 中"The expression e is used as a glvalue if and only if the initialization uses it as a glva