Skip to content

编译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));
  }