oceanvase使用centos8官方仓库llvm编译错误

测试环境
observer
【 使用版本 】
【问题描述】使用ld.lld最后链接出问题,一些llvm相关符号未找到
【复现路径】执行./build.sh,最后生成obsever可直执行文件时,出现错误,具体信息请看图片。使用的是centos8中官方仓库的llvm11.0.1。想请问下咱们仓库里的llvm是有做什么修改吗,在编译observer时候,是必须要用observrer中提供的llvm吗?或者这个llvm在编译时候添加了一些特殊参数吗?非常感谢回复,谢谢

【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

您的问题描述表明在使用 CentOS 8 官方仓库中的 LLVM 11.0.1 来编译 OceanBase 时遇到了一些问题,具体表现为一些 LLVM 相关的符号未被找到。这可能是由于编译时使用的 LLVM 版本与 OceanBase 预期的 LLVM 版本不匹配导致的。 [1]

根据您提供的信息以及 OCR 提取的文本内容,可以看出编译过程中出现了多个 undefined symbol 的错误,这些错误通常意味着链接器在编译期间未能找到相应的符号定义。 [1]

针对您的疑问:

  1. 关于 OceanBase 仓库中的 LLVM 是否做了修改:OceanBase 项目可能会对 LLVM 进行特定的定制或优化以满足其需求,但这并不意味着所有情况下都必须使用 OceanBase 提供的 LLVM 版本。然而,为了确保编译过程顺利进行,建议使用经过验证的 LLVM 版本,特别是那些已经被 OceanBase 团队测试过的版本。

  2. 是否必须使用 OceanBase 提供的 LLVM:虽然理论上可以使用其他版本的 LLVM 进行编译,但由于 OceanBase 可能依赖于某些特定版本的 LLVM 提供的功能或行为,因此使用非官方提供的 LLVM 版本可能会遇到兼容性问题。建议优先考虑使用 OceanBase 推荐或提供的 LLVM 版本来避免此类问题。

  3. 编译时是否添加了特殊参数:在编译过程中,OceanBase 可能会使用一些特定的编译选项来优化性能或启用某些特性。如果您使用的是默认的编译脚本(如 ./build.sh),那么这些选项应该已经被正确设置。但如果手动调整了编译参数,则需要注意保持与 OceanBase 预期的一致性。

综上所述,建议您尝试使用 OceanBase 官方提供的 LLVM 版本进行编译,或者至少确保您的 LLVM 版本与 OceanBase 的要求相匹配。此外,也可以检查编译时使用的配置文件和参数,确保它们与官方文档中的指导一致。如果问题仍然存在,建议联系 OceanBase 的技术支持团队获取进一步的帮助。 [1]

更多信息请查看:

  1. 4000 ~ 4499
  2. 0001 ~ 3999
  3. 600.6000-6999-of-mysql-mode.md
1 个赞

非常不建议使用自己的编译器。
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)在编译过程中,使用的编译参数能否提供参考下。

根据您的描述,您在使用 CentOS 8 官方仓库中的 LLVM 11.0.1 替换 OceanBase 自带的 LLVM 时遇到了 undefined symbol 的错误,并且发现这些符号在 LLVM 的静态库中确实存在。您还提到在 OceanBase 的工程文件中设置了 _GLIBCXX_USE_CXX11_ABI=0,这意味着在编译过程中需要确保所有相关的库都使用相同的 ABI 设置。

为了更好地解决您的问题,我们可以从以下几个方面入手:

  1. 确认 LLVM 编译参数:OceanBase 在编译过程中确实会对 LLVM 进行特定的配置。根据您的描述,您已经注意到 _GLIBCXX_USE_CXX11_ABI=0 这个参数的重要性。这意味着在编译 LLVM 时也需要设置相同的参数。

  2. OceanBase 自带 LLVM 的编译参数:OceanBase 自带的 LLVM 版本为 llvm-11.0.1-312022092921,这意味着它已经经过了一定的定制。虽然具体的编译参数没有直接提供,但我们可以推测一些常用的配置项。

  3. 确保一致性:为了确保编译的一致性,建议您使用与 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 设置。确保所有相关库的一致性是解决这类问题的关键。

希望这些建议能够帮助您解决问题。如果还有其他疑问,请随时提问。

更多信息请查看:

  1. 100.overview-of-ob-admin.md
  2. 1000.ob-error.md
  3. 100.install-and-deploy-obcdc.md
  4. 600.oceanbase-connector-c.md
  5. 400.V3.1.1.md
  6. 900.upload-rpm.md
  7. 300.odp-transmission-encryption.md
  8. 300.use-sysbench-to-test-the-performance-of-oceanbase-database.md

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

编译LLVM的代码在这里:
https://github.com/oceanbase/ob-deps/blob/master/rpm/obdevtools-llvm.11.1.0.spec