当前位置: 首页> 科技> 数码 > 国药控股北京有限公司_邮政招c1驾驶员8000元_天津网络推广公司_东莞seo代理

国药控股北京有限公司_邮政招c1驾驶员8000元_天津网络推广公司_东莞seo代理

时间:2025/7/9 22:57:34来源:https://blog.csdn.net/tcben/article/details/142675220 浏览次数:0次
国药控股北京有限公司_邮政招c1驾驶员8000元_天津网络推广公司_东莞seo代理

向大佬lyf学习,先把其8服务器中所授fine

文章目录

  • 前言
  • 一、CMakeList.txt 命令
    • 1. 最外层CMakeLists
      • 1.1 cmake_minimum_required()
      • 1.2 project()
      • 1.3 set()
      • 1.4 add_subdirectory()
    • 2. 内层CMakeLists
  • 二、clangd 如何使用 compile_commands.json
    • 2.1 compile_commands.json
    • 2.2 clangd利用compile_commands.json
  • 三、静态库和动态库
    • 3.1 静态库(Static Library)
    • 3.2 动态库(Shared Library 或 Dynamic Library)
  • 总结


前言

不能光写代码,也需要提升宏观的工程能力,
还是那句话,深度。


一、CMakeList.txt 命令

1. 最外层CMakeLists

1.1 cmake_minimum_required()

指定项目所需的 CMake 最低版本。如果当前 CMake 版本低于指定版本,CMake 会发出错误并停止配置过程。
通过指定最低版本,可以确保项目使用的 CMake 功能和特性在该版本中可用,从而避免因版本不兼容而导致的问题。

1.2 project()

定义一个项目的名称和相关信息
project() 命令会生成一些有用的变量,如:
PROJECT_NAME: 项目名称。
PROJECT_SOURCE_DIR: 项目源代码的根目录。
PROJECT_BINARY_DIR: 项目构建目录。

1.3 set()

用于为 CMake 脚本中的变量赋值,可以为 CMake 自带的变量(如 CMAKE_CXX_FLAGS_DEBUG、CMAKE_BUILD_TYPE)或用户自定义的变量赋值

典型的用法是 set(变量名 值),通过这种方式将某个值赋给 CMake 中的某个变量。

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG")

如此处,是将"$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG"赋给CMAKE_CXX_FLAGS_DEBUG ,CMAKE_CXX_FLAGS_DEBUG 是CMake内部变量,是 CMake 提供的一个预定义变量,它专门用于存储在 Debug 构建类型 下(即 CMAKE_BUILD_TYPE 设置为 Debug 时)的编译器选项

ENV是系统环境变量,在linux中可以通过printenv来查看env信息,如果 $ ENV{CXXFLAGS}没找到CXXFLAGS的话,就会返回空字符串从而直接将-O0 -Wall -g -ggdb -DDEBUG赋给CMAKE_CXX_FLAGS_DEBUG
这句话在 CMake 中的作用是为 C++ 编译器设置在 Debug 模式下的编译标志
“$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -DDEBUG”:

  • $ENV{CXXFLAGS}:这是 CMake 语法,用于从操作系统的环境变量 CXXFLAGS 中读取值。如果 CXXFLAGS 存在,它的值会被插入到这个位置;如果不存在,这部分将为空。
  • -O0:关闭优化。Debug 模式下,编译器不会优化代码,这样可以让代码结构尽量保持原样,以便调试。
  • -Wall:启用所有常规警告。编译器会输出所有常见的潜在问题警告,帮助开发者发现代码中的潜在错误。
  • -g:生成调试信息。这会让编译器在生成的可执行文件中包含调试符号,以便在调试器(如 GDB)中使用。
  • -ggdb:为 GDB 调试器生成更多的调试信息,优化调试体验。
    -DDEBUG:定义 DEBUG 宏。在代码中,可能会有一些只在 Debug 模式下执行的代码,通过 #ifdef DEBUG 进行条件编译,这个宏可以帮助启用这些代码块。

1.4 add_subdirectory()

add_subdirectory(src) 是 CMake 中的一个命令,用于将指定的子目录(这里是 src 目录)添加到当前 CMake 项目中。CMake 会递归地处理该子目录中的 CMakeLists.txt 文件,并将该目录中的构建目标、编译选项等内容合并到主项目中

2. 内层CMakeLists

二、clangd 如何使用 compile_commands.json

2.1 compile_commands.json

compile_commands.json 中的每条记录都包含三个重要的字段:

directory:编译时的工作目录。
command:完整的编译命令,包含编译器、编译选项、头文件搜索路径、宏定义等。
file:源文件的路径。
这三个字段的作用如下:

directory:表示运行编译命令时的当前目录。编译器通常会使用这个目录作为基准来解析相对路径的头文件或者依赖文件路径。clangd 通过这个字段确保在正确的目录下解析文件路径,正确查找头文件等依赖项。

command:这个字段是实际用于编译该源文件的完整命令行。它包括:

编译器路径(如 /usr/bin/g++),clangd 使用这个信息来模拟真实的编译环境。
编译选项(如 -Wall, -O2, -g),这些选项会影响 clangd 如何解析代码。
头文件包含路径(如 -I/path/to/includes),clangd 通过这些选项能够找到头文件,并理解项目的依赖关系。
宏定义(如 -DDEBUG),这些定义会影响代码的编译和行为,clangd 使用这些定义来精确解析带有条件编译的代码。
file:表示当前需要编译的源文件。clangd 通过这个字段知道要解析和分析哪个源文件。

2.2 clangd利用compile_commands.json

  1. 解析 compile_commands.json 文件
    当你在某个项目中使用 clangd 时,clangd 会首先查找并解析构建目录中的 compile_commands.json 文件。每一条记录代表一个源文件的编译命令,clangd 会根据需要处理不同的源文件。

  2. 智能跳转
    智能跳转是指当你在编辑器中点击某个符号(如函数、变量、类名等)时,clangd 能够跳转到符号的定义或声明处。为了做到这一点,clangd 需要完整解析代码的上下文,这就依赖于正确的编译配置。具体过程如下:
    通过 compile_commands.json 中的 file 字段找到对应的源文件。
    从 directory 字段得知该文件的工作目录,并进入该目录,确保相对路径能够正确解析。
    通过 command 字段获取完整的编译命令,解析头文件路径、宏定义等编译选项。
    使用这些信息构建编译环境,然后解析源文件,构建符号表。
    当用户点击某个符号时,clangd 利用解析的符号表找到其定义或声明,并跳转到对应的位置。

  3. 代码补全
    代码补全功能依赖于对代码的准确解析。在编辑器中,当你输入一个变量或对象名称时,clangd 可以根据上下文提供可能的补全项。为了提供精确的补全,clangd 必须知道项目的完整编译过程。以下是具体步骤:
    clangd 从 compile_commands.json 中提取与当前文件相关的编译命令(通过 file 字段匹配当前正在编辑的文件)。
    它使用 command 字段中的编译选项来理解该文件是如何编译的,尤其是头文件搜索路径和宏定义。
    通过 directory 字段,clangd 确保在正确的目录中解析相对路径的头文件。
    利用这些信息,clangd 可以解析当前文件和其依赖的头文件,分析代码结构。
    当用户请求代码补全时,clangd 根据已有的符号表和代码上下文生成可能的补全建议。

  4. 错误诊断和静态分析
    通过 compile_commands.json 提供的信息,clangd 也可以对代码进行更精确的错误诊断。例如,某些编译选项(如宏定义、头文件搜索路径)可能会影响到编译器能否正确处理某段代码。clangd 使用这些选项来确保它分析代码时的环境与实际编译环境一致,这样可以帮助开发者更早地发现编译错误或潜在问题。

三、静态库和动态库

3.1 静态库(Static Library)

扩展名:静态库在 Linux 和 macOS 中通常是 .a 文件,在 Windows 中是 .lib 文件。

编译时链接:静态库在编译阶段被直接链接到可执行文件中。在生成可执行文件时,静态库的代码被完整地拷贝到最终的可执行文件中。

  • 优点:
    独立性:静态链接的可执行文件不依赖于外部的库文件,在运行时不需要额外的库文件。
    运行效率:静态库在运行时无需动态加载,运行速度更快,因为所有库代码都已经编译进可执行文件中。

  • 缺点:
    文件体积大:由于库的代码被拷贝到可执行文件中,生成的可执行文件通常比动态链接方式大。
    更新不便:如果静态库有更新,所有依赖该库的可执行文件都需要重新编译。
    CMake 中创建静态库: 使用 add_library() 命令,并将 STATIC 作为参数:

add_library(my_static_lib STATIC lib_source1.cpp lib_source2.cpp)

这会生成一个静态库 my_static_lib.a(在 Linux/macOS)或 my_static_lib.lib(在 Windows)。

3.2 动态库(Shared Library 或 Dynamic Library)

扩展名:动态库在 Linux 中是 .so 文件,在 macOS 中是 .dylib 文件,在 Windows 中是 .dll 文件。

运行时链接:动态库在运行时才被加载到内存中。可执行文件只包含对动态库的引用,而不直接包含库的代码。在可执行文件运行时,操作系统会加载动态库,并链接到可执行文件中。

  • 优点:
    节省空间:由于多个可执行文件可以共享一个动态库,生成的可执行文件较小,而且系统内存中也只需加载一次动态库。
    更新方便:动态库更新时,不需要重新编译可执行文件。只需替换动态库即可使所有依赖的可执行文件使用新版库。

  • 缺点:
    运行时依赖:可执行文件在运行时依赖于动态库,因此动态库必须存在于系统的库路径中。如果动态库缺失或版本不兼容,可执行文件将无法运行。
    加载开销:在运行时加载和链接动态库可能会引入一定的性能开销。
    CMake 中创建动态库: 使用 add_library() 命令,并将 SHARED 作为参数:

add_library(my_shared_lib SHARED lib_source1.cpp lib_source2.cpp)

这会生成一个动态库 my_shared_lib.so(在 Linux)或 my_shared_lib.dll(在 Windows)。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

关键字:国药控股北京有限公司_邮政招c1驾驶员8000元_天津网络推广公司_东莞seo代理

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: