首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMAKE_EXPORT_COMPILE_COMMANDS无法工作,因为许多cpp文件被构建成一个大文件

CMAKE_EXPORT_COMPILE_COMMANDS无法工作,因为许多cpp文件被构建成一个大文件
EN

Stack Overflow用户
提问于 2021-06-05 09:58:05
回答 2查看 197关注 0票数 0

我想使用CMAKE_EXPORT_COMPILE_COMMANDS来生成compile_commands.json,但是我发现有很多文件被遗漏了。以下是我的发现:

  1. 我修改了一个名为ob_join_order.cpp的文件,然后再次构建该项目,然后我看到
代码语言:javascript
复制
Building CXX objectsrc/sql/CMakeFiles/ob_sql.dir/Unity/unity_ob_sql_optimizer/0_cxx.cxx.o

您可以看到它不是ob_join_order.cpp,但它是0_cxx.cxx.o。通过检查文件src/sql/CMakeFiles/ob_sql.dir/Unity/unity_ob_sql_optimizer/0_cxx.cxx,,我看到了这样的东西。

代码语言:javascript
复制
#include "/u01/yizhi/github/oceanbase/src/sql/optimizer/ob_join_order.cpp"
#ifdef USING_LOG_PREFIX
#undef USING_LOG_PREFIX
#endif

#include "/u01/yizhi/github/oceanbase/src/sql/optimizer/ob_log_monitoring_dump.cpp"
#ifdef USING_LOG_PREFIX
#undef USING_LOG_PREFIX
#endif

所以我认为在编译器编译源文件之前,源文件被合并成一个大的源文件。这就是为什么CMAKE_EXPORT_COMPILE_COMMANDS失败的原因。

这是CMake的一些技术吗?我怎么才能让它失效?

所有的东西都可以通过

代码语言:javascript
复制
git clone https://github.com/oceanbase/oceanbase.git

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 540863a..d12c4e4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,6 +9,8 @@ project("OceanBase CE"
   HOMEPAGE_URL "https://www.oceanbase.com/"
   LANGUAGES CXX C ASM)
 
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
+
 ob_define(WITH_OSS OFF)
 
 if(ENABLE_DEBUG_LOG)
diff --git a/build.sh b/build.sh
index 98f91e4..0d17d42 100755
--- a/build.sh
+++ b/build.sh
@@ -94,7 +94,7 @@ function do_build
 {
     TYPE=$1; shift
     prepare_build_dir $TYPE || return
-    ${CMAKE_COMMAND} ${TOPDIR} "$@"
+    ${CMAKE_COMMAND}  -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ${TOPDIR} "$@"
 }

sh build.sh debug --init --make
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-05 10:17:40

您是正确的,所有的文件都被收集到一个文件中,而CMake是部分责任。然而,这不是默认的CMake行为。

OceanBase被专门配置为一个统一构建,这意味着所有的翻译单元都被收集到一个“统一”翻译单元中。您可以看到他们在哪里设置的在他们的cmake公用设施里。相关的目标属性是UNITY_BUILD ON

票数 1
EN

Stack Overflow用户

发布于 2021-11-05 03:41:53

首先,您应该知道cmake如何编译项目。

在海洋基地项目中,您应该在一个ob_join_order.cpp目标组中更改unity_build名称,然后编译该项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67848375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档