测试环境
observer
【 使用版本 】
【问题描述】使用ld.lld最后链接出问题,一些llvm相关符号未找到
【复现路径】执行./build.sh,最后生成obsever可直执行文件时,出现错误,具体信息请看图片。使用的是centos8中官方仓库的llvm11.0.1。想请问下咱们仓库里的llvm是有做什么修改吗,在编译observer时候,是必须要用observrer中提供的llvm吗?或者这个llvm在编译时候添加了一些特殊参数吗?非常感谢回复,谢谢
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):
【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
1 个赞
论坛小助手
#3
您的问题描述表明在使用 CentOS 8 官方仓库中的 LLVM 11.0.1 来编译 OceanBase 时遇到了一些问题,具体表现为一些 LLVM 相关的符号未被找到。这可能是由于编译时使用的 LLVM 版本与 OceanBase 预期的 LLVM 版本不匹配导致的。 [1]
根据您提供的信息以及 OCR 提取的文本内容,可以看出编译过程中出现了多个 undefined symbol 的错误,这些错误通常意味着链接器在编译期间未能找到相应的符号定义。 [1]
针对您的疑问:
-
关于 OceanBase 仓库中的 LLVM 是否做了修改:OceanBase 项目可能会对 LLVM 进行特定的定制或优化以满足其需求,但这并不意味着所有情况下都必须使用 OceanBase 提供的 LLVM 版本。然而,为了确保编译过程顺利进行,建议使用经过验证的 LLVM 版本,特别是那些已经被 OceanBase 团队测试过的版本。
-
是否必须使用 OceanBase 提供的 LLVM:虽然理论上可以使用其他版本的 LLVM 进行编译,但由于 OceanBase 可能依赖于某些特定版本的 LLVM 提供的功能或行为,因此使用非官方提供的 LLVM 版本可能会遇到兼容性问题。建议优先考虑使用 OceanBase 推荐或提供的 LLVM 版本来避免此类问题。
-
编译时是否添加了特殊参数:在编译过程中,OceanBase 可能会使用一些特定的编译选项来优化性能或启用某些特性。如果您使用的是默认的编译脚本(如 ./build.sh
),那么这些选项应该已经被正确设置。但如果手动调整了编译参数,则需要注意保持与 OceanBase 预期的一致性。
综上所述,建议您尝试使用 OceanBase 官方提供的 LLVM 版本进行编译,或者至少确保您的 LLVM 版本与 OceanBase 的要求相匹配。此外,也可以检查编译时使用的配置文件和参数,确保它们与官方文档中的指导一致。如果问题仍然存在,建议联系 OceanBase 的技术支持团队获取进一步的帮助。 [1]
更多信息请查看:
- 4000 ~ 4499
- 0001 ~ 3999
- 600.6000-6999-of-mysql-mode.md
1 个赞
王运来
#4
非常不建议使用自己的编译器。
OceanBase提供的LLVM是没有修改的,只是打包在deps下减少各种环境导致的问题。
从你的编译错误信息来看,是缺少LLVM的一些库,或者编译时没有找到LLVM的库,objit是使用LLVM来做运行时编译的。
1 个赞
1、OceanBase编译使用的是debug和release两种方式,编译参数没有进行调整。
2、使用的OceanBase的版本为v4.1.0_CE_BP4_HF1,该版本中llvm使用的版本为llvm-11.0.1-312022092921,测试环境使用llvm-11.0.1来进行替换,然后最后链接出现undefined symbol。从版本上看,这两个版本差异应该很小。使用工具查看,报undefined symbol错误的符号,在llvm的静态库中也能找到,在objit的工程文件中找到了-D_GLIBCXX_USE_CXX11_ABI=0这个编译选项,经过查找,这个参数跟ABI接口有关。OceanBase工程文件中将GLIBCXX_USE_CXX11_ABI设置为0,这样就在OceanBase在编译过程中使用到的链接库,都必须要使用GLIBCXX_USE_CXX11_ABI=0进行重新编译,才能保证最后链接成功。目前使用centos8官方仓库的llvm11的编译参数为cmake -DLLVM_ENABLE_PROJECTS=clang -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0" -DCMAKE_CXX_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0" …/llvm
所以现在想请问下,Oceanbase仓库中提供的编译工具(llvm)在编译过程中,使用的编译参数能否提供参考下。
论坛小助手
#6
根据您的描述,您在使用 CentOS 8 官方仓库中的 LLVM 11.0.1 替换 OceanBase 自带的 LLVM 时遇到了 undefined symbol
的错误,并且发现这些符号在 LLVM 的静态库中确实存在。您还提到在 OceanBase 的工程文件中设置了 _GLIBCXX_USE_CXX11_ABI=0
,这意味着在编译过程中需要确保所有相关的库都使用相同的 ABI 设置。
为了更好地解决您的问题,我们可以从以下几个方面入手:
-
确认 LLVM 编译参数:OceanBase 在编译过程中确实会对 LLVM 进行特定的配置。根据您的描述,您已经注意到 _GLIBCXX_USE_CXX11_ABI=0
这个参数的重要性。这意味着在编译 LLVM 时也需要设置相同的参数。
-
OceanBase 自带 LLVM 的编译参数:OceanBase 自带的 LLVM 版本为 llvm-11.0.1-312022092921
,这意味着它已经经过了一定的定制。虽然具体的编译参数没有直接提供,但我们可以推测一些常用的配置项。
-
确保一致性:为了确保编译的一致性,建议您使用与 OceanBase 自带 LLVM 相同的编译参数。这包括但不限于 -D_GLIBCXX_USE_CXX11_ABI=0
。
基于这些信息,您可以参考以下编译参数来编译 LLVM:
cmake -DLLVM_ENABLE_PROJECTS=clang -DLLVM_BUILD_LLVM_DYLIB=ON -DLLVM_LINK_LLVM_DYLIB=ON -DCMAKE_BUILD_TYPE=Release \\
-DCMAKE_C_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0" \\
-DCMAKE_CXX_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0" \\
../llvm
这个命令包含了以下关键参数:
-
-DLLVM_ENABLE_PROJECTS=clang
: 启用 Clang 项目。
-
-DLLVM_BUILD_LLVM_DYLIB=ON
: 构建 LLVM 动态库。
-
-DLLVM_LINK_LLVM_DYLIB=ON
: 链接 LLVM 动态库。
-
-DCMAKE_BUILD_TYPE=Release
: 设置构建类型为 Release。
-
-DCMAKE_C_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0"
: 设置 C 编译器标志。
-
-DCMAKE_CXX_FLAGS="-mcmodel=large -D_GLIBCXX_USE_CXX11_ABI=0"
: 设置 C++ 编译器标志。
通过这种方式,您可以确保 LLVM 的编译参数与 OceanBase 的要求一致,从而避免 undefined symbol
的问题。
如果您仍然遇到问题,建议您进一步检查其他依赖库是否也使用了相同的 ABI 设置。确保所有相关库的一致性是解决这类问题的关键。
希望这些建议能够帮助您解决问题。如果还有其他疑问,请随时提问。
更多信息请查看:
- 100.overview-of-ob-admin.md
- 1000.ob-error.md
- 100.install-and-deploy-obcdc.md
- 600.oceanbase-connector-c.md
- 400.V3.1.1.md
- 900.upload-rpm.md
- 300.odp-transmission-encryption.md
- 300.use-sysbench-to-test-the-performance-of-oceanbase-database.md
(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)
王运来
#7