之前在ubuntu16上对Clickhouse21.12.1.1的基础上改了一些代码,近期把操作系统升级到unbutu 22.04后,发现编译不通过,具体报错为:
[ 22%] Linking CXX shared library libclickhouse_common_iod.so
/home/herry/dev/c++/ClickHouse/src/Common/ThreadFuzzer.cpp:293: error: undefined reference to '__pthread_mutex_lock'
/home/herry/dev/c++/ClickHouse/src/Common/ThreadFuzzer.cpp:293: error: undefined reference to '__pthread_mutex_unlock'
因为连接libckickhouse_common_iod.so时找不到__pthread_mutex_lock,首先考虑的是没有连接pthread,在src/CMakeLists.txt中添加
target_link_libraries(clickhouse_common_io PUBLIC pthread)
编译仍然提示同样的错误
用make VERBOSE=1可以看到libclickhouse_common_iod.so的链接过程中,已经有-lpthread了,看起来不是这个问题了。
在ubuntu16中
herry@herrypc:/lib/x86_64-linux-gnu$ nm -D libpthread.so.0 |grep pthread_mutex_lock
000000000000b650 T __pthread_mutex_lock@@GLIBC_2.2.5
000000000000b650 W pthread_mutex_lock@@GLIBC_2.2.5
可以看到pthread_mutex_lock和__pthread_mutex_lock都在libpthread.so.0中
在ubuntu22中
herry@inc:/lib/x86_64-linux-gnu$ nm -D libpthread.so.0 |grep pthread_mutex_lock
herry@inc:/lib/x86_64-linux-gnu$
herry@inc:/lib/x86_64-linux-gnu$ readelf -s libpthread.so.0 |grep pthread_mutex_
herry@inc:/lib/x86_64-linux-gnu$
发现libpthread.so.0中已经没有pthread_mutex_lock和__pthread_mutex_lock了。
参考文章[glibc2.34 removed libpthread
(https://developers.redhat.com/articles/2021/12/17/why-glibc-234-removed-libpthread#)。
从glibc2.34开始,glibc已经把pthread的功能基本都去掉了,剩下的libpthread.so基本上是个空的,只是为了让编译适配早期版本。
所以虽然我们有-lpthread,但是在其中仍然找不到__pthread_mutex_lock/unlock符号。
glibc版本号查看
方法1:
herry@inc:/lib/x86_64-linux-gnu$ ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3) 2.35
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
方法2:
root@inc:/usr/lib/x86_64-linux-gnu# chmod +x libc.so.6
root@inc:/usr/lib/x86_64-linux-gnu# /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 11.2.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
两个方法都看出在ubuntu22.04上的glibc版本已经升级到2.35。
查看ubuntu22.04上的libc的符号列表
root@inc:/usr/lib/x86_64-linux-gnu# nm -D /lib/x86_64-linux-gnu/libc.so.6 |grep pthread_mutex_lock
0000000000097f70 T __pthread_mutex_lock@GLIBC_2.2.5
0000000000097f70 T pthread_mutex_lock@@GLIBC_2.2.5
果然发现了__pthread_mutex_lock符号。
在clickhouse的问题列表中,找到了Fix undefined __pthread_mutex_lock/unlock for glibc,果然在新版本中,已经对该问题就是修复。
增加了针对glibc不同版本的适配代码。
/// Starting from glibc 2.34 there are no internal symbols without version,
/// so not __pthread_mutex_lock but __pthread_mutex_lock@2.2.5
#if defined(OS_LINUX) and !defined(USE_MUSL)
/// You can get version from glibc/sysdeps/unix/sysv/linux/$ARCH/$BITS_OR_BYTE_ORDER/libc.abilist
#if defined(__amd64__)
# define GLIBC_SYMVER "GLIBC_2.2.5"
#elif defined(__aarch64__)
# define GLIBC_SYMVER "GLIBC_2.17"
#elif defined(__riscv) && (__riscv_xlen == 64)
# define GLIBC_SYMVER "GLIBC_2.27"
#elif (defined(__PPC64__) || defined(__powerpc64__)) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
# define GLIBC_SYMVER "GLIBC_2.17"
#else
# error Your platform is not supported.
#endif
#define GLIBC_COMPAT_SYMBOL(func) __asm__(".symver " #func "," #func "@" GLIBC_SYMVER);
GLIBC_COMPAT_SYMBOL(__pthread_mutex_unlock)
GLIBC_COMPAT_SYMBOL(__pthread_mutex_lock)
#endif
把这段代码拷贝到我的工作代码中,编译,果然能够能够成功了。
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我在s3上有一堆文件。我使用.fog配置文件设置了雾,这样我就可以启动fog并获得提示。如果我知道文件的路径,现在如何访问和编辑s3上的文件? 最佳答案 最简单的方法可能是使用IRB或PRY获取文件的本地副本,或者编写一个简单的脚本来下载、编辑然后重新上传。假设您有一个名为data.txt的文件。您可以使用以下脚本初始化与S3的连接。require'fog'connection=Fog::Storage.new({:provider=>'AWS',:aws_secret_access_key=>YOUR_SECRET_ACCESS_
我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da
我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack
我有一个问题。如果bundle更新,Gemfile.lock总是被提交。今天,当我部署web应用程序时,我看到了这条错误消息,Couldnotfindjwt-1.5.3inanyofthesourcesjwt-1.5.2安装在已部署服务器的共享gem路径中。我认为bundleinstallnewjwt-1.5.3gem因为Gemfile.lock中指定的版本(1.5.3)和安装的版本(1.5.2)不相等。为什么不能bundleinstalljwtgem?如果找不到jwt-1.5.3,是否应该捆绑安装那个gem? 最佳答案 删除Gem
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat