我想使用CMAKE_EXPORT_COMPILE_COMMANDS来生成compile_commands.json,但是我发现有很多文件被遗漏了。以下是我的发现:
ob_join_order.cpp的文件,然后再次构建该项目,然后我看到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,,我看到了这样的东西。
#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的一些技术吗?我怎么才能让它失效?
所有的东西都可以通过
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发布于 2021-06-05 10:17:40
您是正确的,所有的文件都被收集到一个文件中,而CMake是部分责任。然而,这不是默认的CMake行为。
OceanBase被专门配置为一个统一构建,这意味着所有的翻译单元都被收集到一个“统一”翻译单元中。您可以看到他们在哪里设置的在他们的cmake公用设施里。相关的目标属性是UNITY_BUILD ON。
发布于 2021-11-05 03:41:53
首先,您应该知道cmake如何编译项目。
在海洋基地项目中,您应该在一个ob_join_order.cpp目标组中更改unity_build名称,然后编译该项目。
https://stackoverflow.com/questions/67848375
复制相似问题