Cmake 中 compiler_depend.ts 文件:解析和使用 C/C++ 预编译头文件

简介: Cmake 中 compiler_depend.ts 文件:解析和使用 C/C++ 预编译头文件

引言

CMake通常使用compiler_depend.ts文件,该文件通常用于记录编译器依赖项,以便在构建时检查版本和兼容性。下面是一个使用compiler_depend.ts文件的示例:

# 创建一个空的compiler_depend.ts文件
file(WRITE ${CMAKE_BINARY_DIR}/compiler_depend.ts "")
# 在编译时生成compiler_depend.ts文件
add_custom_command(TARGET my_target POST_BUILD
    COMMAND ${CMAKE_C_COMPILER} -v -E -x c /dev/null > ${CMAKE_BINARY_DIR}/compiler_depend.ts
    COMMENT "Generating compiler_depend.ts"
)

在这个示例中,add_custom_command命令可以在构建时执行自定义命令。该命令使用CMAKE_C_COMPILER编译器生成版本信息,并将其重定向到compiler_depend.ts文件中。
请注意,上述示例仅适用于GCC编译器。如果您使用不同的编译器,您需要相应地修改add_custom_command命令。


compiler_depend.ts文件的内容

compiler_depend.ts 是在CMake 3.0版本中引入的。CMake是一个用于构建和管理C/C++项目的工具,它包含了许多用于构建和管理项目的选项和工具。在CMake 3.0版本中,CMake引入了一个名为compiler_depend.ts的文件,用于跟踪编译器和库的依赖项。这个文件通常包含以下内容:
名称:指定所依赖的编译器和库的名称。例如,scssize/jsx-runtime@^5.0.29
版本:指定当前已知的编译器和库的最新版本。例如,typescript v10.0.11
系统路径:指定编译器和库的位置。例如,node:6.14.4,npm v8.21.7
描述:包括编译器和库与其他组件和代码文件之间的依赖关系的详细信息。
例如,scssize : TypeScript module that relies on React and Reduct components in ./src/index.d.ts files, with additional dependencies of stdlib’s strings() function from corejs modules at /usr/include/nodejs/libexpat.h=63f0ef1a27a34beabe7b7fc936e2f7f210a229ddd23cc1e99}} (Node v62)
因此,可以使用任何文本编辑器打开该文件,然后浏览其中包含的信息,以了解编译器和库与其他文件之间的依赖关系。


compiler_depend.ts文件的作用

compiler_depend.ts是用于 CMake 构建系统的辅助文件。该文件记录了编译器的依赖项,以便在构建时检查版本和兼容性。
在 CMake 构建系统中,compiler_depend.ts 文件是由 CMakeDetermineCompilerABI.cmake 脚本生成的。该脚本的作用是确定编译器的 ABI(应用二进制接口),并生成 compiler_depend.ts 文件来记录编译器的依赖项。该文件通常被用于检查编译器版本和兼容性,以确保代码在不同的编译器上都能正确工作。
请注意,compiler_depend.ts 文件的扩展名 .ts 并不代表它是 TypeScript 文件。在此上下文中,.ts 扩展名代表 “toolstamp”,表示该文件包含工具的时间戳和版本信息。
总之,compiler_depend.ts 文件是 CMake 构建系统的辅助文件,用于记录编译器的依赖项。


在 CMake 中,使用 add_custom_command 命令,可以通过 DEPENDS 参数指定命令所依赖的文件。
如果项目中没有使用 add_custom_command 命令,并且仍然看到 compiler_depend.ts 文件被作为依赖项的情况,那可能是因为项目中使用了 ExternalProject_Add 命令或者其他 CMake 的插件或者模块。
ExternalProject_Add 命令可以用于构建和安装外部项目。

在使用 ExternalProject_Add 命令时,CMake 会生成一个名为 compile_commands.json 的文件,该文件包含编译器命令和其它编译器选项。为了让 CMake 知道这个文件的存在,CMake 会将 compiler_depend.ts 文件作为 compile_commands.json 文件的依赖项。这是因为 compile_commands.json 文件是由 add_custom_command 命令生成的,而 compiler_depend.ts 文件是 compile_commands.json 的依赖项。
因此,如果您的项目中使用了 ExternalProject_Add 命令或其他 CMake 插件或模块,那么 compiler_depend.ts 文件可能会被作为依赖项。如果您不确定 compiler_depend.ts 文件是否被作为依赖项,可以通过设置 CMAKE_VERBOSE_MAKEFILE 变量为 ON 来查看 CMake 生成的详细输出。

gcc -M和gcc -MM的区别

gcc -M参数用于控制编译器优化,而gcc -MM参数用于控制链接器优化。
在GCC中,-m选项用于指定目标模块(即将要被编译的源文件),-mm选项用于指定库模块(即将要被链接的目标文件)。

  • gcc -MM会生成一个名为“.gcda”的文件,它包含了所有需要被编译的头文件,这些头文件可以被其他程序使用。
  • gcc -M会生成一个名为“.gmo”的文件,它包含了所有需要被编译的宏定义,这些宏定义可以被其他程序使用。

总之,gcc -M和gcc -MM的主要区别在于它们的参数不同,前者用于控制编译器优化,后者用于控制链接器优化。


compiler_depend.ts文件的生成

  • 如果在代码中定义了 #define COMPILER_DEPENDENCY “main.cpp”,那么在 compiler_depend.ts.in 文件中使用 @COMPILER_DEPENDENCY@ 变量时,它会被替换为 “main.cpp”。这样,在生成 compiler_depend.ts 文件时,它的内容就会包含 “main.cpp” 这个文件的名称。
  • 当使用 find_package 命令时,生成 compiler_depend.ts 文件取决于软件包的配置文件是否定义了 CONFIGURE_DEPENDS 选项。

如何禁用compiler_depend.ts文件

1.在软件包的配置文件中,可以使用 set 命令将 CONFIGURE_DEPENDS 选项设置为 OFF。示例如下:
set(CONFIGURE_DEPENDS OFF)
或者,可以在调用 install 命令时,将 CONFIGURE_DEPENDS 选项设置为 OFF。示例如下:

install(TARGETS my_library
        EXPORT my_library-config
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        INCLUDES DESTINATION include
        CONFIGURATIONS Release
        CONFIGURE_DEPENDS OFF) 


这样,当在构建项目时,使用 find_package 命令查找该软件包时,CMake 将不会生成 compiler_depend.ts 文件。此时,如果需要使用该软件包,需要手动创建 compiler_depend.ts 文件,并将相关的依赖项信息写入该文件中。



2.compiler_depend.ts 文件是由 CMake 自动生成的,主要用于管理编译器生成的依赖关系。如果你的项目中包含了头文件或库文件,那么 CMake 会分析它们之间的依赖关系,并生成 compiler_depend.ts 文件。
如果你不需要这个文件,可以尝试在 CMakeLists.txt 文件中添加以下代码:

set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 0)#CMake 将不会使用 response file 的方式来传递头文件路径。这样可以避免 response file 本身出现问题而导致编译失败。
set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)#禁用 CMake 生成compile_commands.json 文件 
set(CMAKE_CXX_DEPENDS_SKIP_SYMLINKS ON)#跳过源文件中的符号链接文件,并不将其视为源文件的一部分。这样可以避免意外地将符号链接文件编译到程序中,减少程序的大小和不必要的资源占用。
set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY ON)#禁用安装目标时生成依赖关系文件
set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM 1)#这个设置可以禁用在 make clean 命令中删除自定义目标。有时候,如果你的项目中存在一些自定义目标,例如 compiler_depend.ts 文件
set(CMAKE_DEPENDS_IN_PROJECT_ONLY ON)#CMake 将只扫描项目目录及其子目录中的文件来确定依赖关系。这样可以减少编译时间和资源占用,但也可能导致依赖关系不完整,需要手动添加依赖项。
file(REMOVE ${CMAKE_BINARY_DIR}/compiler_depend.ts)

这些设置可能可以禁用 CMake 自动生成 compiler_depend.ts 文件,以及其他一些相关设置。同时,如果你已经手动删除了 compiler_depend.ts 文件,也可以使用上面的设置来防止它再次生成。
如果你的项目中确实需要 compiler_depend.ts 文件,并且希望它不被 CMake 自动生成,你可以使用 add_custom_target 命令手动创建这个文件,例如:

add_custom_target(compiler_depend.ts
    COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/compiler_depend.ts
    DEPENDS ${MY_SOURCE_FILES}
    )

这个命令会创建一个名为 compiler_depend.ts 的自定义目标,当目标被构建时,它会执行 touch 命令,以创建一个空的 compiler_depend.ts 文件。其中 ${MY_SOURCE_FILES} 是你的项目中需要分析依赖关系的源文件列表。


目录
相关文章
|
18天前
|
XML JavaScript 前端开发
xml文件使用及解析
xml文件使用及解析
|
29天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
38 0
|
30天前
|
存储 C++
基于C++的简易文件压缩与解压缩工具设计与实现
基于C++的简易文件压缩与解压缩工具设计与实现
16 3
|
1月前
|
算法 Linux 开发者
CMake深入解析:打造高效动态链接库路径设置
CMake深入解析:打造高效动态链接库路径设置
45 0
|
24天前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
1天前
|
C++
C++:深度解析与实战应用
C++:深度解析与实战应用
7 1
|
8天前
|
XML C# 数据格式
C# 解析XML文件
C# 解析XML文件
17 1
|
23天前
|
C++
C++ While 和 For 循环:流程控制全解析
本文介绍了C++中的`switch`语句和循环结构。`switch`语句根据表达式的值执行匹配的代码块,可以使用`break`终止执行并跳出`switch`。`default`关键字用于处理没有匹配`case`的情况。接着,文章讲述了三种类型的循环:`while`循环在条件满足时执行代码,`do/while`至少执行一次代码再检查条件,`for`循环适用于已知循环次数的情况。`for`循环包含初始化、条件和递增三个部分。此外,还提到了嵌套循环和C++11引入的`foreach`循环,用于遍历数组元素。最后,鼓励读者关注微信公众号`Let us Coding`获取更多内容。
21 0
|
25天前
C/C++test两步完成CMake项目静态分析
通过将C/C++test集成到CMake项目中,并根据项目的需要进行配置,可以在两步内完成CMake项目的静态分析。这样可以帮助开发人员及时发现并修复潜在的代码问题,提高代码质量和可靠性。
8 0
|
25天前
|
C++ Python
【C++/Python】C++调用python文件
【C++/Python】C++调用python文件

热门文章

最新文章

推荐镜像

更多