编译pika报make Makefile 229 opt pika third ro
- what: 编译pika报make: *** [Makefile:229: /opt/pika/third/rocksdb/librocksdb.a] Error 2
- where: centos8 aarch64
- when: 2021.1.4
- who: JRT
- why: 移植问题解决记录
- how:
- release: 3.6.6
1.问题描述
使用PORTABLE=1 make编译报如下错:
memtable/skiplistrep.cc:28:28: required from here
./memtable/inlineskiplist.h:282:11: error: ‘void* memcpy(void*, const void*, size_t)’ writing to an object of type ‘struct std::atomic<rocksdb::InlineSkipList<const rocksdb::MemTableRep::KeyComparator&>::Node*>’ with no trivial copy-assignment [-Werror=class-memaccess]
memcpy(&next_[0], &height, sizeof(int));
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ./memtable/inlineskiplist.h:47,
from memtable/skiplistrep.cc:6:
/usr/include/c++/8/atomic:352:12: note: ‘struct std::atomic<rocksdb::InlineSkipList<const rocksdb::MemTableRep::KeyComparator&>::Node*>’ declared here
struct atomic<_Tp*>
^~~~~~~~~~~~
CC monitoring/thread_status_updater.o
CC monitoring/thread_status_updater_debug.o
CC monitoring/thread_status_util.o
CC monitoring/thread_status_util_debug.o
CC options/cf_options.o
cc1plus: all warnings being treated as errors
make[1]: *** [Makefile:1809: memtable/skiplistrep.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/opt/pika/third/rocksdb'
make: *** [Makefile:229: /opt/pika/third/rocksdb/librocksdb.a] Error 2
2.问题分析
#参考链接:https://www.cnblogs.com/saikaimei/p/14396369.html
memcpy 会按照内存写入数据。并不会执行拷贝构造函数。当执行拷贝操作时,拷贝指向的类或者结构体如果存在指针,
并且指针指向了动态申请的对象或者数组。此指针将被拷贝源的指针覆盖。而当程序退出时,这部分被覆盖的数据将造成数据泄露。这类警告应该属于编码错误。
3.问题解决
memcpy ( &upoData[i] , &pData , sizeof ( UData ) ) ;---->memcpy ( (void)&upoData[i] , (void)&pData , sizeof ( UData ) ) ;
#在inlineskiplist.h中约282行,StashHeight函数中增加(void*),具体见下文
vim /usr/local/pika/third/rocksdb/memtable/inlineskiplist.h
void StashHeight(const int height) {
assert(sizeof(int) <= sizeof(next_[0]));
memcpy((void*)&next_[0], (void*)&height, sizeof(int));
}