问题描述
在发布支持 c++20 后,我有一些 c++ 项目,我想将我的 makefile std support 17 升级到 20,在那之后我的编译器(gcc10.2)给了我这样的错误;
In file included from /usr/local/lib/gcc10/include/c++/bits/node_handle.h:39,from /usr/local/lib/gcc10/include/c++/bits/stl_tree.h:72,from /usr/local/lib/gcc10/include/c++/map:60,from Asyncsql.h:10,from Asyncsql.cpp:4:
/usr/local/lib/gcc10/include/c++/optional: In function 'constexpr std::strong_ordering std::operator<=>(const std::optional<_Tp>&,std::nullopt_t)':
/usr/local/lib/gcc10/include/c++/optional:1052:24: error: invalid operands of types 'bool' and 'int' to binary 'operator<=>'
1052 | { return bool(__x) <=> false; }
| ~~~~~~~~~ ^~~
| |
| bool
gmake[2]: *** [Makefile:23: Asyncsql.o] Error 1
这是我的 Asyncsql.cpp ;
#include <sys/time.h>
#include <cstdlib>
#include <cstring>
#include "Asyncsql.h"
#define MUTEX_LOCK(mtx) pthread_mutex_lock(mtx)
#define MUTEX_UNLOCK(mtx) pthread_mutex_unlock(mtx)
CAsyncsql::CAsyncsql(): m_stHost (""),m_stUser (""),m_stPassword (""),m_stDB (""),m_stLocale (""),m_imsgCount (0),m_iPort (0),m_bEnd (false),m_hThread (0),m_mtxQuery (NULL),m_mtxResult (NULL),m_iQueryFinished (0),m_ulThreadID (0),m_bConnected (false),m_icopiedQuery (0)
{
memset (&m_hDB,sizeof (m_hDB));
m_aiPipe[0] = 0;
m_aiPipe[1] = 0;
}
CAsyncsql::~CAsyncsql()
{
Quit();
Destroy();
}
void CAsyncsql::Destroy()
{
if (m_hDB.host)
{
sys_log (0,"Asyncsql: closing MysqL connection.");
MysqL_close (&m_hDB);
m_hDB.host = NULL;
}
if (m_mtxQuery)
{
pthread_mutex_destroy (m_mtxQuery);
delete m_mtxQuery;
m_mtxQuery = NULL;
}
if (m_mtxResult)
{
pthread_mutex_destroy (m_mtxResult);
delete m_mtxResult;
m_mtxQuery = NULL;
}
}
void* AsyncsqlThread (void* arg)
{
CAsyncsql* psql = ((CAsyncsql*) arg);
if (!psql->Connect())
{
return NULL;
}
psql->ChildLoop();
return NULL;
}
bool CAsyncsql::QueryLocaleSet()
{
if (0 == m_stLocale.length())
{
sys_err ("m_stLocale == 0");
return true;
}
if (MysqL_set_character_set (&m_hDB,m_stLocale.c_str()))
{
sys_err ("cannot set locale %s by 'MysqL_set_character_set',errno %u %s",m_stLocale.c_str(),MysqL_errno (&m_hDB),MysqL_error (&m_hDB));
return false;
}
sys_log (0,"\t--MysqL_set_character_set(%s)",m_stLocale.c_str());
return true;
}
bool CAsyncsql::Connect()
{
if (0 == MysqL_init (&m_hDB))
{
fprintf (stderr,"MysqL_init Failed\n");
return false;
}
if (!m_stLocale.empty())
{
if (MysqL_options (&m_hDB,MysqL_SET_CHARSET_NAME,m_stLocale.c_str()) != 0)
{
fprintf (stderr,"MysqL_option Failed : MysqL_SET_CHARSET_NAME %s ",MysqL_error(&m_hDB));
}
}
if (!MysqL_real_connect (&m_hDB,m_stHost.c_str(),m_stUser.c_str(),m_stPassword.c_str(),m_stDB.c_str(),m_iPort,NULL,CLIENT_MULTI_STATEMENTS))
{
fprintf (stderr,"MysqL_real_connect: %s\n",MysqL_error(&m_hDB));
return false;
}
my_bool reconnect = true;
if (0 != MysqL_options (&m_hDB,MysqL_OPT_RECONNECT,&reconnect))
{
fprintf (stderr,"MysqL_option: %s\n",MysqL_error(&m_hDB));
}
m_ulThreadID = MysqL_thread_id (&m_hDB);
m_bConnected = true;
return true;
}
bool CAsyncsql::Setup (CAsyncsql* sql,bool bNoThread)
{
return Setup (sql->m_stHost.c_str(),sql->m_stUser.c_str(),sql->m_stPassword.c_str(),sql->m_stDB.c_str(),sql->m_stLocale.c_str(),bNoThread,sql->m_iPort);
}
bool CAsyncsql::Setup (const char* c_pszHost,const char* c_pszUser,const char* c_pszPassword,const char* c_pszDB,const char* c_pszLocale,bool bNoThread,int iPort)
{
m_stHost = c_pszHost;
m_stUser = c_pszUser;
m_stPassword = c_pszPassword;
m_stDB = c_pszDB;
m_iPort = iPort;
if (c_pszLocale)
{
m_stLocale = c_pszLocale;
sys_log (0,"Asyncsql: locale %s",m_stLocale.c_str());
}
if (!bNoThread)
{
m_mtxQuery = new pthread_mutex_t;
m_mtxResult = new pthread_mutex_t;
if (0 != pthread_mutex_init (m_mtxQuery,NULL))
{
perror ("pthread_mutex_init");
exit (0);
}
if (0 != pthread_mutex_init (m_mtxResult,NULL))
{
perror ("pthread_mutex_init");
exit (0);
}
pthread_create (&m_hThread,AsyncsqlThread,this);
return true;
}
else
{
return Connect();
}
}
void CAsyncsql::Quit()
{
m_bEnd = true;
m_sem.Release();
if (m_hThread)
{
pthread_join (m_hThread,NULL);
m_hThread = NULL;
}
}
sqlMsg* CAsyncsql::DirectQuery (const char* c_pszQuery)
{
if (m_ulThreadID != MysqL_thread_id (&m_hDB))
{
sys_log (0,"MysqL connection was reconnected. querying locale set");
while (!QueryLocaleSet());
m_ulThreadID = MysqL_thread_id (&m_hDB);
}
sqlMsg* p = new sqlMsg;
p->m_pksql = &m_hDB;
p->iID = ++m_imsgCount;
p->stQuery = c_pszQuery;
if (MysqL_real_query (&m_hDB,p->stQuery.c_str(),p->stQuery.length()))
{
char buf[1024];
snprintf (buf,sizeof(buf),"Asyncsql::DirectQuery : MysqL_query error: %s\nquery: %s",MysqL_error (&m_hDB),p->stQuery.c_str());
sys_err (buf);
p->uisqlErrno = MysqL_errno (&m_hDB);
}
p->Store();
return p;
}
void CAsyncsql::AsyncQuery (const char* c_pszQuery)
{
auto p = new sqlMsg;
p->m_pksql = &m_hDB;
p->iID = ++m_imsgCount;
p->stQuery = c_pszQuery;
PushQuery (p);
}
void CAsyncsql::ReturnQuery (const char* c_pszQuery,void* pvUserData)
{
auto p = new sqlMsg;
p->m_pksql = &m_hDB;
p->iID = ++m_imsgCount;
p->stQuery = c_pszQuery;
p->bReturn = true;
p->pvUserData = pvUserData;
PushQuery (p);
}
void CAsyncsql::PushResult (sqlMsg* p)
{
MUTEX_LOCK (m_mtxResult);
m_queue_result.push (p);
MUTEX_UNLOCK (m_mtxResult);
}
bool CAsyncsql::PopResult(sqlMsg** pp)
{
MUTEX_LOCK (m_mtxResult);
if (m_queue_result.empty())
{
MUTEX_UNLOCK (m_mtxResult);
return false;
}
*pp = m_queue_result.front();
m_queue_result.pop();
MUTEX_UNLOCK (m_mtxResult);
return true;
}
void CAsyncsql::PushQuery (sqlMsg* p)
{
MUTEX_LOCK (m_mtxQuery);
m_queue_query.push (p);
m_sem.Release();
MUTEX_UNLOCK (m_mtxQuery);
}
bool CAsyncsql::PeekQuery (sqlMsg** pp)
{
MUTEX_LOCK (m_mtxQuery);
if (m_queue_query.empty())
{
MUTEX_UNLOCK (m_mtxQuery);
return false;
}
*pp = m_queue_query.front();
MUTEX_UNLOCK (m_mtxQuery);
return true;
}
bool CAsyncsql::PopQuery (int iID)
{
MUTEX_LOCK (m_mtxQuery);
if (m_queue_query.empty())
{
MUTEX_UNLOCK (m_mtxQuery);
return false;
}
m_queue_query.pop();
MUTEX_UNLOCK (m_mtxQuery);
return true;
}
bool CAsyncsql::PeekQueryFromcopyQueue (sqlMsg** pp)
{
if (m_queue_query_copy.empty())
{
return false;
}
*pp = m_queue_query_copy.front();
return true;
}
int CAsyncsql::copyQuery()
{
MUTEX_LOCK (m_mtxQuery);
if (m_queue_query.empty())
{
MUTEX_UNLOCK (m_mtxQuery);
return -1;
}
while (!m_queue_query.empty())
{
sqlMsg* p = m_queue_query.front();
m_queue_query_copy.push (p);
m_queue_query.pop();
}
int count = m_queue_query_copy.size();
MUTEX_UNLOCK (m_mtxQuery);
return count;
}
bool CAsyncsql::PopQueryFromcopyQueue()
{
if (m_queue_query_copy.empty())
{
return false;
}
m_queue_query_copy.pop();
return true;
}
int CAsyncsql::GetcopiedQueryCount()
{
return m_icopiedQuery;
}
void CAsyncsql::ResetcopiedQueryCount()
{
m_icopiedQuery = 0;
}
void CAsyncsql::AddcopiedQueryCount (int icopiedQuery)
{
m_icopiedQuery += icopiedQuery;
}
DWORD CAsyncsql::CountQuery()
{
return m_queue_query.size();
}
DWORD CAsyncsql::CountResult()
{
return m_queue_result.size();
}
void __timediff (struct timeval* a,struct timeval* b,struct timeval* rslt)
{
if (a->tv_sec < b->tv_sec)
{
rslt->tv_sec = rslt->tv_usec = 0;
}
else if (a->tv_sec == b->tv_sec)
{
if (a->tv_usec < b->tv_usec)
{
rslt->tv_sec = rslt->tv_usec = 0;
}
else
{
rslt->tv_sec = 0;
rslt->tv_usec = a->tv_usec - b->tv_usec;
}
}
else
{
rslt->tv_sec = a->tv_sec - b->tv_sec;
if (a->tv_usec < b->tv_usec)
{
rslt->tv_usec = a->tv_usec + 1000000 - b->tv_usec;
rslt->tv_sec--;
}
else
{
rslt->tv_usec = a->tv_usec - b->tv_usec;
}
}
}
class cProfiler
{
public:
cProfiler()
{
m_nInterval = 0 ;
memset (&prev,sizeof (prev));
memset (&Now,sizeof (Now));
memset (&interval,sizeof (interval));
Start();
}
cProfiler (int nInterval = 100000)
{
m_nInterval = nInterval;
memset (&prev,sizeof (interval));
Start();
}
void Start()
{
gettimeofday (&prev,(struct timezone*) 0);
}
void Stop()
{
gettimeofday (&Now,(struct timezone*) 0);
__timediff (&Now,&prev,&interval);
}
bool IsOk()
{
if (interval.tv_sec > (m_nInterval / 1000000))
{
return false;
}
if (interval.tv_usec > m_nInterval)
{
return false;
}
return true;
}
struct timeval* GetResult()
{
return &interval;
}
long GetResultSec()
{
return interval.tv_sec;
}
long GetResultUSec()
{
return interval.tv_usec;
}
private:
int m_nInterval;
struct timeval prev;
struct timeval Now;
struct timeval interval;
};
void CAsyncsql::ChildLoop()
{
cProfiler profiler(500000);
while (!m_bEnd)
{
m_sem.Wait();
int count = copyQuery();
if (count <= 0)
{
continue;
}
AddcopiedQueryCount (count);
sqlMsg* p;
while (count--)
{
profiler.Start();
if (!PeekQueryFromcopyQueue (&p))
{
continue;
}
if (m_ulThreadID != MysqL_thread_id (&m_hDB))
{
sys_log (0,"MysqL connection was reconnected. querying locale set");
while (!QueryLocaleSet());
m_ulThreadID = MysqL_thread_id (&m_hDB);
}
if (MysqL_real_query (&m_hDB,p->stQuery.length()))
{
p->uisqlErrno = MysqL_errno (&m_hDB);
sys_err ("Asyncsql: query Failed: %s (query: %s errno: %d)",p->uisqlErrno);
switch (p->uisqlErrno)
{
case CR_SOCKET_CREATE_ERROR:
case CR_CONNECTION_ERROR:
case CR_IPSOCK_ERROR:
case CR_UNKNowN_HOST:
case CR_SERVER_GONE_ERROR:
case CR_CONN_HOST_ERROR:
case ER_NOT_KEYFILE:
case ER_CRASHED_ON_USAGE:
case ER_CANT_OPEN_FILE:
case ER_HOST_NOT_PRIVILEGED:
case ER_HOST_IS_BLOCKED:
case ER_PASSWORD_NOT_ALLOWED:
case ER_PASSWORD_NO_MATCH:
case ER_CANT_CREATE_THREAD:
case ER_INVALID_USE_OF_NULL:
m_sem.Release();
sys_err ("Asyncsql: retrying");
continue;
}
}
profiler.Stop();
if (!profiler.IsOk())
{
sys_log (0,"[QUERY : LONG INTERVAL(OverSec %ld.%ld)] : %s",profiler.GetResultSec(),profiler.GetResultUSec(),p->stQuery.c_str());
}
PopQueryFromcopyQueue();
if (p->bReturn)
{
p->Store();
PushResult (p);
}
else
{
delete p;
}
++m_iQueryFinished;
}
}
sqlMsg* p;
while (PeekQuery (&p))
{
if (m_ulThreadID != MysqL_thread_id (&m_hDB))
{
sys_log (0,"MysqL connection was reconnected. querying locale set");
while (!QueryLocaleSet());
m_ulThreadID = MysqL_thread_id (&m_hDB);
}
if (MysqL_real_query (&m_hDB,p->stQuery.length()))
{
p->uisqlErrno = MysqL_errno (&m_hDB);
sys_err ("Asyncsql::ChildLoop : MysqL_query error: %s:\nquery: %s",p->stQuery.c_str());
switch (p->uisqlErrno)
{
case CR_SOCKET_CREATE_ERROR:
case CR_CONNECTION_ERROR:
case CR_IPSOCK_ERROR:
case CR_UNKNowN_HOST:
case CR_SERVER_GONE_ERROR:
case CR_CONN_HOST_ERROR:
case ER_NOT_KEYFILE:
case ER_CRASHED_ON_USAGE:
case ER_CANT_OPEN_FILE:
case ER_HOST_NOT_PRIVILEGED:
case ER_HOST_IS_BLOCKED:
case ER_PASSWORD_NOT_ALLOWED:
case ER_PASSWORD_NO_MATCH:
case ER_CANT_CREATE_THREAD:
case ER_INVALID_USE_OF_NULL:
continue;
}
}
sys_log (0,"QUERY_FLUSH: %s",p->stQuery.c_str());
PopQuery (p->iID);
if (p->bReturn)
{
p->Store();
PushResult (p);
}
else
{
delete p;
}
++m_iQueryFinished;
}
}
int CAsyncsql::CountQueryFinished()
{
return m_iQueryFinished;
}
void CAsyncsql::ResetQueryFinished()
{
m_iQueryFinished = 0;
}
MysqL* CAsyncsql::GetsqlHandle()
{
return &m_hDB;
}
size_t CAsyncsql::Escapestring (char* dst,size_t dstSize,const char* src,size_t srcSize)
{
if (0 == srcSize)
{
memset (dst,dstSize);
return 0;
}
if (0 == dstSize)
{
return 0;
}
if (dstSize < srcSize * 2 + 1)
{
char tmp[256];
size_t tmpLen = sizeof (tmp) > srcSize ? srcSize : sizeof (tmp);
strlcpy (tmp,src,tmpLen);
sys_err ("Fatal error!! not enough buffer size (dstSize %u srcSize %u src%s: %s)",dstSize,srcSize,tmpLen != srcSize ? "(trimmed to 255 characters)" : "",tmp);
dst[0] = '\0';
return 0;
}
return MysqL_real_escape_string (GetsqlHandle(),dst,srcSize);
}
void CAsyncsql2::SetLocale (const std::string & stLocale)
{
m_stLocale = stLocale;
QueryLocaleSet();
}
这是我的 Asyncsql.h
#ifndef __INC_METIN_II_ASYNCsql_H__
#define __INC_METIN_II_ASYNCsql_H__
#include "../../libthecore/src/stdafx.h"
#include "../../libthecore/src/log.h"
#include "../../Ayarlar.h"
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <MysqL/server/MysqL.h>
#include <MysqL/server/errmsg.h>
#include <MysqL/server/MysqLd_error.h>
#include "Semaphore.h"
typedef struct _sqlResult
{
_sqlResult(): psqlResult (NULL),uiNumRows (0),uiAffectedRows (0),uiInsertID (0) {}
~_sqlResult()
{
if (psqlResult)
{
MysqL_free_result (psqlResult);
psqlResult = NULL;
}
}
MysqL_RES* psqlResult;
uint32_t uiNumRows;
uint32_t uiAffectedRows;
uint32_t uiInsertID;
} sqlResult;
typedef struct _sqlMsg
{
_sqlMsg() : m_pksql (NULL),iID (0),uiResultPos (0),pvUserData (NULL),bReturn (false),uisqlErrno (0) {}
~_sqlMsg()
{
auto first = vec_pkResult.begin();
auto past = vec_pkResult.end();
while (first != past)
{
delete * (first++);
}
vec_pkResult.clear();
}
void Store()
{
do
{
sqlResult* pRes = new sqlResult;
pRes->psqlResult = MysqL_store_result (m_pksql);
pRes->uiInsertID = MysqL_insert_id (m_pksql);
pRes->uiAffectedRows = MysqL_affected_rows (m_pksql);
if (pRes->psqlResult)
{
pRes->uiNumRows = MysqL_num_rows (pRes->psqlResult);
}
else
{
pRes->uiNumRows = 0;
}
vec_pkResult.push_back (pRes);
}
while (!MysqL_next_result (m_pksql));
}
sqlResult* Get()
{
if (uiResultPos >= vec_pkResult.size())
{
return NULL;
}
return vec_pkResult[uiResultPos];
}
bool Next()
{
if (uiResultPos + 1 >= vec_pkResult.size())
{
return false;
}
++uiResultPos;
return true;
}
MysqL* m_pksql;
int iID;
std::string stQuery;
std::vector<sqlResult *> vec_pkResult;
unsigned int uiResultPos;
void* pvUserData;
bool bReturn;
unsigned int uisqlErrno;
} sqlMsg;
class CAsyncsql
{
public:
CAsyncsql();
virtual ~CAsyncsql();
void Quit();
bool Setup (const char* c_pszHost,bool bNoThread = false,int iPort = 0);
bool Setup (CAsyncsql* sql,bool bNoThread = false);
bool Connect();
bool IsConnected()
{
return m_bConnected;
}
bool QueryLocaleSet();
void AsyncQuery (const char* c_pszQuery);
void ReturnQuery (const char* c_pszQuery,void* pvUserData);
sqlMsg* DirectQuery (const char* c_pszQuery);
DWORD CountQuery();
DWORD CountResult();
void PushResult (sqlMsg* p);
bool PopResult (sqlMsg** pp);
void ChildLoop();
MysqL* GetsqlHandle();
int CountQueryFinished();
void ResetQueryFinished();
size_t Escapestring (char* dst,size_t srcSize);
protected:
void Destroy();
void PushQuery (sqlMsg* p);
bool PeekQuery (sqlMsg** pp);
bool PopQuery (int iID);
bool PeekQueryFromcopyQueue (sqlMsg** pp );
INT copyQuery();
bool PopQueryFromcopyQueue();
public:
int GetcopiedQueryCount();
void ResetcopiedQueryCount();
void AddcopiedQueryCount (int icopiedQuery);
protected:
MysqL m_hDB;
std::string m_stHost;
std::string m_stUser;
std::string m_stPassword;
std::string m_stDB;
std::string m_stLocale;
int m_imsgCount;
int m_aiPipe[2];
int m_iPort;
std::queue<sqlMsg*> m_queue_query;
std::queue<sqlMsg*> m_queue_query_copy;
std::queue<sqlMsg*> m_queue_result;
volatile bool m_bEnd;
pthread_t m_hThread;
pthread_mutex_t* m_mtxQuery;
pthread_mutex_t* m_mtxResult;
CSemaphore m_sem;
int m_iQueryFinished;
unsigned long m_ulThreadID;
bool m_bConnected;
int m_icopiedQuery;
};
class CAsyncsql2 : public CAsyncsql
{
public:
void SetLocale (const std::string & stLocale);
};
#endif
这就是函数出错的原因;
可选:1052;
#ifdef __cpp_lib_three_way_comparison
template<typename _Tp>
constexpr strong_ordering
operator<=>(const optional<_Tp>& __x,nullopt_t) noexcept
{ return bool(__x) <=> false; }
#else
在看到微软发布的文档后,我将尝试 false;像这样再次出错..
此致。
解决方法
我不知道为什么它看起来是 bool(__x) false 作为 bool 和 int 比较。 我认为您之前包含的文件中有一些奇怪的宏,以包含将破坏标准代码的标头。 我建议您尝试将标准标题移至标准标题上方,然后将其移至“用户定义”标题下方。
import cv2
# Load the cascade
face_cascade = cv2.CascadeClassifier('cascade.xml')
# To capture video from webcam.
cap = cv2.VideoCapture(0)
# To use a video file as input
# cap = cv2.VideoCapture('filename.mp4')
while True:
# Read the frame
_,img = cap.read()
original = img
# Convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Detect the faces
faces = face_cascade.detectMultiScale(gray,1.1,4)
# Draw the rectangle around each face
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0),10)
# Display
cv2.imshow('img',img)
#cv2.imshow('original',original)
# Stop if escape key is pressed
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Release the VideoCapture object
cap.release()
编辑: 我已经找到了问题的原因。 在“libthrecore/stdafx.h”中定义的宏(我拥有使用作者的文件,它们是公开的)。
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <mysql/server/mysql.h>
#include <mysql/server/errmsg.h>
#include <mysql/server/mysqld_error.h>
#include "../../libthecore/src/stdafx.h"
#include "../../libthecore/src/log.h"
#include "../../Ayarlar.h"
#include "Semaphore.h"
它导致 false 被读取为 int 并导致飞船操作员失败并显示作者显示的错误。上移标准标题或删除宏以解决错误。