记编译 Doris 的过程

news2024/11/19 9:38:35

目录

概述

1、关于clang

2、链接静态库的问题

3、 cmake的知识

4、关于nm

5、关于 ABI

6、关于debug info


概述

尝试编译 doris,其过程异常坎坷,不过也学到了很多东西。

首先,按照doris官网上的编译指导,下载ldb_toolchain_gen.sh,安装编译工具链,doris默认是用clang编译的,但是我尝试debug的时候,出现core dump,也许是因为我的Linux版本太旧了,我一开始用的是CentOS7,内核版本是3.10,glibc库也是libc-2.17.so,而且执行ldb_toolchain_gen所带的gdb时也会报错:

gdb: error while loading shared libraries: libsource-highlight.so.4: cannot open shared object file: No such file or directory

其实clang编译的c/c++可执行文件,也可以用gdb调试的,不过要保证它们的兼容性。不过我一开始不懂,以为clang编译的程序必须用lldb,而gdb只能调试gcc编译的程序,但是当尝试用lldb调试clang编译的程序时,出现core dump。

于是又尝试用gcc编译(修改env.sh),但是最后又遇到glibc太旧的问题。可能是预编译的第三方库调用了新版本的glibc。

关于第三方库,一开始是下载源码编译的,但是我嫌这个过程太长,就按照官网直接下载预编译的第三方库二进制文件。

最后尝试在更高版本的CentOS上编译:安装了CentOS-Stream-9虚拟机。它自带了gcc 11,glibc也是更新版本的,可以直接安装clang,对于CentOS-Stream-9,dnf代替了yum,但是命令行选项的含义都是一样的,只是开头的命令从yum换成了dnf。

在CentOS-Stream-9上,使用gcc而不是clang,doris分支为master,只要对源码工程做小小的改动,就可以编译成功了(这里是指编译be),这种方式编译出来的be也可以用自带的gdb调试。

同时尝试了CentOS-Stream-9上,编译doris的tag:1.2.4.3,它不用修改,编译工程会选择使用gcc。这个过程感到master上的代码由很多问题,最好不要用它编译,应该用tag版本的代码。截止本文,doris最新发布版为1.2.5。

关于glibc的信息,参考:NewAppsOnOldGlibc (lightofdawn.org)

在这个过程中学到的几个知识点:

1、关于clang

没有深入研究,只当它是gcc/g++的代替,使用方法,命令行选项的含义大多与 gcc/g++ 相同,且编译出的可执行程序也可以用gdb调试的(测试过),也可以用lldb调试(没测试过),动态库,静态库的链接和使用也和gcc/g++相同。

 通过阅读网上文章,感觉clang的跨平台性更好一些,macOS,windows用clang编译器。

clang和llvm是配合使用的,只有clang是不能生成机器代码的,从源码编译llvm时会自动编译clang。

2、链接静态库的问题

如果链接的是动态库,或链接时全都是.o,那没有问题,但是如果有.a文件,这些静态库就有个顺序问题,简单地说,就是.a文件(或.o文件)里面也会依赖其它库定义的符号,被依赖的库文件必须出现在依赖它的库文件后面,才不会出现undefined reference错误,这个问题的解决,除了人工调整.a文件的顺序外,还可以使用连接选项-Wl,--start-group和-Wl,--end-group,把一些.a文件放在这两个选项之间,链接器寻找符号时会多次扫描这两个选项之间的.a文件,无论它们顺序如何,或者它们之间有怎样复杂的循环依赖都可以处理,也可以没有-Wl,--end-group,只有-Wl,--start-group,表示-Wl,--start-group的后面的都在影响范围内。

但是对于动态链接,有一个链接器选项:-Wl,--as-needed,也要求so文件在目标文件后面,估计是避免不必要的链接,就是不会把命令行里所有so链接到可执行文件。 

还遇到一个问题,libkrb5.a 要依赖 libresolv.a,但是我的/usr/lib64里只有libresolv.so,没有静态版本,链接时指定了 -lresolv,还是会报错:

undefined reference to '__res_nsearch'

解决办法就是链接doris_be的时候,给出libresolv.a的绝对路径,幸好在ldb_toolchain里有libresolv.a。

至于 -L -lname的链接选项,我暂时理解这是给动态库用的。

关于静态库和动态库的编译选项:

1、动态连接库中用到的object文件必须是用 "-shared -fPIC"选项编译产生的,否则连接时要么报错,要么被忽略。

2、静态库中的object文件最好也用"-shared -fPIC"选项编译,这样静态库就可以同时被连接到.so 或者可执行性文件中。

参考:

(40条消息) C/C++ 静态链接的顺序问题_howard_shooter的博客-CSDN博客

Static and Dynamic Linkage in C++ - jdhao's digital space 

3、 cmake的知识

cmake类似于configure,可以生成Makefile或其它IDE的编译工程,既然它在Makefile或IDE上面加了一层,那它应该比它们更易用才行,不过我感到cmake也没有多么易用,只是业界都在使用,我也只好学着用。

用户创建cmake工程,最关键的是编写CMakeLists.txt,在cmake工程中只有它不是自动生成的,需要人工编写,要编译哪些源文件,要用到哪些编译选项,宏定义,动态连接还是静态链接,生成的是可执行程序还是库,都在CMakeLists.txt指定,所以当想修改工程的编译选项,宏定义,或是编译时出什么问题,都应该在CMakeLists.txt里寻找线索。

CMakeLists.txt是目录嵌套的,就是说,对于一个有许多层目录的cmake工程,根目录有一个CMakeLists.txt,子目录下可能也有CMakeLists.txt,父目录的CMakeLists.txt中用add_subdirectory将子目录下的CMakeLists.txt联系起来。

CMakeLists.txt和*.cmake文件是cmake脚本,里面按照cmake语法编写,有许多cmake的功能函数,例如:

set(BUILD_STATIC_LIBRARIES ON)  -- 用于设置cmake变量

add_library(Geo STATIC
    geo_common.cpp
    wkt_parse.cpp
    wkb_parse.cpp
    ${GENSRC_DIR}/geo/wkt_lex.l.cpp
    ${GENSRC_DIR}/geo/wkt_yacc.y.cpp
    geo_tobinary.cpp
    ByteOrderValues.cpp
    machine.h
    geo_types.cpp
)
-- 编译生成库文件

add_executable(doris_be doris_main.cpp)  -- 编译生成可执行文件

target_link_libraries(doris_be
        ${DORIS_LINK_LIBS}
    )

-- 连接可执行文件

add_executable是指生成可执行文件doris_be需将哪些源文件包含进来。

target_link_libraries是指生成可执行文件doris_be除了上面的源文件,还要链接哪些库文件。

两者不冲突,如果只有add_executable,没有target_link_libraries,那就把源文件直接编译生成可执行文件。

include_directories:   增加头文件搜索路径
link_directories:         增加库文件搜索路径

cmake生成的Makefile工程,执行make时默认不显示编译gcc命令,要想像configure&make显示每个文件的编译命令,有三种方法:

方法1:

执行命令cmake时追加:-DCMAKE_VERBOSE_MAKEFILE=ON

方法2:

在CMakeLists.txt中添加:set(CMAKE_VERBOSE_MAKEFILEON ON)

方法3:

make时追加: VERBOSE=1

4、关于nm

我用来查看可执行文件或者库文件的符号表,对于C++符号名会被mangle,可读性差,可以nm时demangle,用-C选项,例如:

nm myprogram -C

显示出的符号中前面的字母含义,这里列出常用的几个:

U :本文件中未定义的

T:本文件中定义的

W/w:这是个弱符号,就是说如果其它文件定义了这个符号且不是弱符号就用其它文件的,否则用本文件的

参考:

(38条消息) linux——nm命令:查看符号表_nm查看符号表_The Goat的博客-CSDN博客

这里有个概念:弱符号

参考:

(40条消息) __attribute__((weak)) 简介及作用___attribute__((weak)) mt_disp_show_charging(int in_侵蚀昨天的博客-CSDN博客

注意:这个weak属性可以用于C语言程序的,这就让C语言程序具备了类似C++的虚函数中的override功能。

5、关于 ABI

ABI是Application Binary Interface的简称。

C/C++发展的过程中,二进制兼容一直是个问题。不同编译器厂商编译的二进制代码之间兼容性不好,甚至同一个编译器的不同版本之间兼容性也不好。

之后,C拥有了统一的ABI,而C++由于其特性的复杂性以及ABI标准推进不力,一直没有自己的ABI。

这就涉及到标识符的mangle问题。比如,C++源码中的同一个函数名,不同的编译器或不同的编译器版本,编译后的名称可能会有不同。

参考:

Dual ABI (gnu.org) 

mangle和demangle - BloodAndBone - 博客园 (cnblogs.com)

C++ standard library ABI compatibility | MaskRay

6、关于debug info

-g和-O2或-O3可以一起使用,优化代码的同时,保存调试信息,之后可以把调试信息单独提取出来,每个可执行文件或库都有对应的.debug文件,里面记录了其中的函数在哪个源文件的那一行,它们总称为debug info。例如,生成产系统上出现段错误,一线运维发挥调用栈或core dump文件,结合debug info,可以指定详细的crash信息。

参考: 

(40条消息) 深入理解debuginfo_Chinainvent的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python图像处理实战(三)—图像几何变换

🚀写在前面🚀 🖊个人主页:https://blog.csdn.net/m0_52051577?typeblog 🎁欢迎各位大佬支持点赞收藏,三连必回!! 🔈本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数,我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…

springDatajpa动态sql根据时间范围将数据导出为excel并使用vue的按钮去触发

用到的技术点&#xff1a; 1.springDatajpa 2.EasyExcel 3.数据库 4.vue 前端实现&#xff1a; 1.创建按钮&#xff08;点击此按钮弹出填写导出条件的弹出框&#xff09; <el-button type"primary" round click"dialogVisible true"><svg-icon …

Java如何实现分库分表

一、为啥要分库分表 在大型互联网系统中&#xff0c;大部分都会选择mysql作为业务数据存储。一般来说&#xff0c;mysql单表行数超过500万行或者单表容量超过2GB&#xff0c;查询效率就会随着数据量的增长而下降。这个时候&#xff0c;就需要对表进行拆分。 那么应该怎么拆分…

vite项目中处理各种静态资源的引入方式介绍

一、引用图片资源 在vite创建的vue3项目中&#xff0c;引用图片资源有以下两种方式&#xff1a; 直接在模板中使用路径引用&#xff1a;在模板中使用标签&#xff0c;通过src属性引用图片。例如&#xff1a; <template><div><img src"./assets/logo.png…

NetApp FAS 存储管理软件,海量非结构化数据存储

NetApp FAS 存储管理软件&#xff0c;海量非结构化数据存储 在 NetApp ONTAP 数据管理软件的支持下&#xff0c;帮助您构建简单、安全且值得信赖的存储基础架构。NetApp FAS 存储阵列可让客户同时兼顾性能和容量。 NetApp FAS 系统经过优化&#xff0c;易于部署和操作&#x…

记录ip段解析成ip

无脑记录者记录使用方法 1.源代码链接 https://github.com/codeexpress/cidr2ip 2.提前准备的内容 go开发语言&#xff0c;链接里面的main.go 3.使用方法 直接新增文件cidrs.txt cidrs.txt文件里面加入需要解析的ip段即可

【实战】 JWT、用户认证与异步请求(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1.login2.middleware of json-server3.jira-dev-tool&#xff08;imooc-jira-tool&#xff09;安装问…

机器学习——自然语言处理(一)

1 分词 1.1 设计原则 切分粒度大&#xff1b;非字典词少、单字字典词少&#xff1b;总体次数少。 1.2 基于词典匹配的分词 1.3 基于语法和规则的分词 目前处在试验阶段 1.4 基于统计的分词 1.5 技术难点 1.5.1 歧义识别 交集型歧义&#xff1a;AB | C or A | BC 组合型…

Jmeter操作数据库运行提示“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver‘”的有效解决

如图所示&#xff0c;在jmeter中运行sql时报错提示“Cannot load JDBC driver class com.mysql.jdbc.Driver” 原因分析&#xff1a;这是因为没有mysql驱动&#xff0c;需要下载对应的jar包 一、下载地址&#xff1a;MySQL :: Download Connector/J 根据需求选择下载&#xf…

数字化转型:智慧物业行业落地与应用的突围之路!

导语 | 红杉中国在《2021 年企业数字化年度指南》中指出&#xff0c;96% 的受访企业已经开展了数字化实践&#xff0c;而其中超过 6 成的受访者都表示期望在未来进一步增加数字化的投入。技术因素或将成为未来两到三年影响企业发展最为重要的外部力量。当前地产与物业行业进入不…

当前最强的免费AI画图、AI绘图工具-2

Midjourney比较贵&#xff0c;而且无法访问&#xff0c;Stable Diffusion部署起来很麻烦。网上有哪些可以直接在网页端或者下载的app可以实现AI画图的工具。我们整理了45个相关工具&#xff0c;这是系列2&#xff0c;收录到 当前最强的免费AI画图、AI绘图工具-2https://www.web…

【C++】-- 高并发内存池

高并发内存池 项目介绍池化技术内存池 定长内存池的实现整体框架threadcachethreadcache整体设计threadcache哈希桶映射对齐规则TLS无锁访问 centralcachecentralcache整体设计centralcache结构设计centralcache的实现 pagecachepagecache整体设计pagecache中获取Span 回收内存…

【C/C++练习】经典的快慢指针问题---移除元素

&#x1f4d6;题目描述 题目出处&#xff1a;移除元素 &#x1f516;示例 &#x1f4d6;题解 对于本题我将按照由易到难的顺序为大家分享三种解题思路&#xff0c;并逐一分析它们的优劣&#xff0c;以及注意事项。 &#x1f516;思路一&#xff1a;暴力求解 我想暴力求解应该…

零-云尚办公项目学习

对于云尚办公项目的学习 1、这是尚硅谷推出的新的OA项目 云尚办公系统是一套自动办公系统&#xff0c;系统主要包含&#xff1a;管理端和员工端 管理端包含:权限管理、审批管理、公众号菜单管理 员工端:采用微信公众号操作&#xff0c;包含&#xff1a;办公审批、微信授权登…

数字通信中的编码(学习笔记)

编码种类 RZ(Return Zero Code)编码 也称为归零码&#xff0c;就是在 一个周期内&#xff0c;用二进制传输数据位&#xff0c;在数据脉冲结束后&#xff0c;需要维持一段时间的低电平。 RZ编码又分为两种&#xff1a; 单极性归零码 低电平表示0&#xff0c;正电平表示1&…

【Java用法】windows10系统下修改jar中的文件并重新打包成jar文件然后运行

windows10系统下修改jar中的文件并重新打包成jar文件然后运行 一、背景描述二、操作步骤2.1 解压jar包2.2 修改配置文件2.3 重新打成jar包2.4 确认是否修改成功2.5 运行程序 一、背景描述 测试环境&#xff08;Linux&#xff09;的代码&#xff08;jar包&#xff09;拉取到本地…

AI数字人:语音驱动面部模型及超分辨率重建Wav2Lip-HD

1 Wav2Lip-HD项目介绍 数字人打造中语音驱动人脸和超分辨率重建两种必备的模型&#xff0c;它们被用于实现数字人的语音和图像方面的功能。通过Wav2Lip-HD项目可以快速使用这两种模型&#xff0c;完成高清数字人形象的打造。 项目代码地址&#xff1a;github地址 1.1…

可再生能源与能源存储技术的结合和互补

在全球对可再生能源的需求日益增长的背景下&#xff0c;如何将可再生能源与能源存储技术相结合&#xff0c;实现能源的高效利用和持续供应成为了一个重要的议题。本文将探讨可再生能源与能源存储技术的结合与互补关系&#xff0c;分析其对能源领域的影响以及未来发展的前景。 …

CSS常用样式

文章目录 字体样式文本样式颜色和背景样式对齐方式下划线、上划线、删除线设置行高 列表样式背景样式背景颜色背景图片背景重复背景大小 鼠标样式伪类样式设置透明度 字体样式 所有样式都写在<style>标签内&#xff0c;里面加选择器 <!DOCTYPE html> <html>…