Open kenlee1988 opened 3 years ago
我也出现了一样的错误
我尝试着找了一些方案,看到其中一个解释是这么说的
The C and C++ standards allows the character type char to be signed or unsigned, depending on the platform and compiler. Most systems, including x86 GNU/Linux and Microsoft Windows, use signed char, but those based on PowerPC and ARM processors typically use unsigned char.(29) This can lead to unexpected results when porting programs between platforms which have different defaults for the type of char.
The compile problem has been fixed. Please checkout the latest version.
新版本未解决,需手动将src/tendisplus/utils/base64.cpp中的DecodeTable与ch变量的定义新增signed
yum install -y python38-devel gcc-c++ flex bison tbb-devel numactl-devel autoconf diffutils
git clone https://github.com/Tencent/tendis.git --recursive
git submodule update --init --recursive
# 切换到标签分支
git stash && git checkout 2.4.2-rocksdb-v5.13.4
# 加权限,解决未来时间的问题
find ./ -name "*.sh" | xargs chmod 777 && find . |xargs touch
git clone https://github.com/doxygen/doxygen.git && \
cd doxygen && \
cmake -G "Unix Makefiles" .. && \
make -j 8 && make install
mkdir bulid
cd build
cmake ../
/opt/Tendis/src/tendisplus/utils/base64.cpp:70:12: error: comparison is always false due to limited range of data type [-Werror=type-limits]
if (ch < 0) {
~~~^~~
cc1plus: some warnings being treated as errors
make[2]: *** [src/tendisplus/utils/CMakeFiles/utils_common.dir/build.make:160: src/tendisplus/utils/CMakeFiles/utils_common.dir/base64.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:2805: src/tendisplus/utils/CMakeFiles/utils_common.dir/all] Error 2
make: *** [Makefile:156: all] Error 2
在build.make同目录下的flags.make中增加忽略选项,形如-Wno-error=class-memaccess。主要有
CMakeLists.txt
-Wno-error=class-memaccess
src/tendisplus/utils/CMakeFiles/utils_common.dir/flags.make
-Wno-error=narrowing -Wno-error=type-limits
src/tendisplus/cluster/CMakeFiles/migrate.dir/flags.make
-Wno-error=parentheses
src/tendisplus/replication/CMakeFiles/repl_manager.dir/flags.make
-Wno-error=format-truncation
(1)
/opt/Tendis/src/tendisplus/utils/test_util.cpp: In function ‘std::shared_ptr<tendisplus::ServerEntry> tendisplus::makeServerEntryOld(const std::shared_ptr<tendisplus::ServerParams>&)’:
/opt/Tendis/src/tendisplus/utils/test_util.cpp:243:57: error: no matching function for call to ‘tendisplus::RocksKVStore::RocksKVStore(const char [8], const std::shared_ptr<tendisplus::ServerParams>&, std::nullptr_t, bool)’
new RocksKVStore(CATALOG_NAME, cfg, nullptr, false))),
^
In file included from /opt/Tendis/src/tendisplus/server/server_entry.h:28,
from /opt/Tendis/src/tendisplus/utils/test_util.h:18,
from /opt/Tendis/src/tendisplus/utils/test_util.cpp:14:
/opt/Tendis/src/tendisplus/storage/rocks/rocks_kvstore.h:211:3: note: candidate: ‘tendisplus::RocksKVStore::RocksKVStore(const string&, const std::shared_ptr<tendisplus::ServerParams>&, std::shared_ptr<rocksdb::Cache>, std::shared_ptr<rocksdb::RateLimiter>, bool, tendisplus::KVStore::StoreMode, tendisplus::RocksKVStore::TxnMode, uint32_t)’
RocksKVStore(const std::string& id,
^~~~~~~~~~~~
/opt/Tendis/src/tendisplus/storage/rocks/rocks_kvstore.h:211:3: note: no known conversion for argument 4 from ‘bool’ to ‘std::shared_ptr<rocksdb::RateLimiter>’
make[2]: *** [src/tendisplus/utils/CMakeFiles/test_util.dir/build.make:76: src/tendisplus/utils/CMakeFiles/test_util.dir/test_util.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:2941: src/tendisplus/utils/CMakeFiles/test_util.dir/all] Error 2
make: *** [Makefile:156: all] Error 2
修改/opt/Tendis/src/tendisplus/utils/test_util.cpp,将RocksKVStore传参中nullptr前加block_cache
(1)
/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
make[2]: *** [src/tendisplus/cluster/CMakeFiles/cluster_test.dir/build.make:158: bin/cluster_test] Error 1
make[1]: *** [CMakeFiles/Makefile2:4229: src/tendisplus/cluster/CMakeFiles/cluster_test.dir/all] Error 2
make: *** [Makefile:156: all] Error 2
由于缺少libstdc++.a文件,故将build.make同目录中的link.txt中的-static-libstdc++ 改成 -lstdc++。主要有以下文件:
src/tendisplus/server/CMakeFiles/tendisplus.dir/link.txt
src/tendisplus/replication/CMakeFiles/binlog_tool.dir/link.txt
src/tendisplus/cluster/CMakeFiles/cluster_test.dir/link.txt
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
如果报错:jemalloc/jemalloc.h:没有那个文件或目录,可以尝试如下编译:
make MALLOC=libc
报错原因: 关于分配器allocator, 如果有MALLOC这个环境变量,会有用这个环境变量去建立Redis。 libc并不是默认的分配器, 默认的是 jemalloc, 因为 jemalloc 被证明比libc有更少的 fragmentation problems。 但是如果你又没有jemalloc 而只有 libc 当然 make 出错。 所以加这么一个参数。
mkdir -p /opt/tendis-v2.4.2-rocksdb-v5.13.4/bin/deps
cp /opt/Tendis/build/bin/binlog_tool /opt/Tendis/build/bin/tendisplus /opt/tendis-v2.4.2-rocksdb-v5.13.4/bin/
cp /usr/lib64/libstdc++.so.6.0.25 /usr/lib64/libnuma.so.1.0.0 /usr/lib64/libnuma.so.1 /usr/lib64/libtbb.so.2 /opt/Tendis/tendis-v2.4.2-rocksdb-v5.13.4/bin/deps/
cd /opt/Tendis/tendis-v2.4.2-rocksdb-v5.13.4/bin/deps/
ln -s libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6
ls -s libstdc++.so.6.0.25 /usr/lib64/libstdc++.so
cp /opt/redis-stable/src/redis-cli /opt/Tendis/build/bin/
使用docker cp命令拷出/opt/tendis-v2.4.2-rocksdb-v5.13.4
从tencentdbforkv/tendisplus:v2.4.0镜像中提取/data1/tendis/scripts文件夹,放在tendis-v2.4.2-rocksdb-v5.13.4目录
FROM centos:8.3.2011
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo && \
yum clean all && yum makecache && yum repolist && yum install -y net-tools
ENV CLUSTER=no REDIS_PASSWORD=test
WORKDIR /data1/
COPY tendis-v2.4.2-rocksdb-v5.13.4.tar.gz /data1/
RUN tar -vxf tendis-v2.4.2-rocksdb-v5.13.4.tar.gz && ln -fs tendis-v2.4.2-rocksdb-v5.13.4 tendis && rm -rf tendis-v2.4.2-rocksdb-v5.13.4.tar.gz && ln -s /data1/tendis/bin/redis-cli /usr/bin/redis-cli
EXPOSE 51002
CMD ["/bin/sh", "-c", "cd /data1/tendis/scripts && sh start.sh && tail -f /data1/tendis/51002/tendisplus.conf"]
也可以直接拉这个arm版本镜像,用法和官方一致。 docker pull xrds1949/tendisplus:2.4.2
鲲鹏ARM下编译错误
代码是最新的dev-2.2分支代码, gcc版本为7.3.0