技术分享
CMake
00 min
Oct 30, 2023
Oct 31, 2023
type
status
date
slug
summary
tags
category
icon
password

编译

一个目录 多个文件

该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名

多个目录 多个文件

  1. 静态链接库
根目录 A 和子目录 B 里各编写一个 CMakeLists.txt 文件。
我们可以先将 B 目录里的文件编译成静态库再由根目录 A 的 main 函数调用。
add_subdirectory:这意味着 CMake 将进入指定的子目录并执行该子目录中的 CMakeLists.txt 文件
include_directories(src)是为了让编译器知道在编译源代码时应该搜索 "src" 目录以找到相关的头文件。
根目录添加 math 子目录并链接子目录生成的静态库:
指定生成 MathFunctions 静态链接库供父目录使用:
  1. 不使用静态库的处理
使用提升变量作用域的方式
PARENT_SCOPE 是一个标志,它告诉 CMake 将 ALL_SOURCES 变量的作用域提升到父级目录中,使得 ALL_SOURCES 变量在父级目录中也可见。
message 可以用来输出信息

编译选项

配置头文件 config.h ,由 CMake 从 config.h.in 生成
需要同时修改源文件
为了便于交互式的选择变量的值,可以使用 ccmake 命令,该命令会提供一个会话式的交互式配置界面
notion image
  • 上箭头和下箭头键:在不同选项之间移动。
  • 左箭头和右箭头键:展开或折叠选项。
  • Enter 键:编辑选项的值。
  • c 键:配置项目。
  • g 键:生成项目配置文件。
notion image

安装和测试

生成的 Demo ELF文件和 MathFunctions 函数库对应 libMathFunctions.o 库文件将会被复制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中。

各种bin文件

所有用户皆可用的系统程序放在/bin
超级用户才能使用的系统程序放在/sbin
所有用户都可用的应用程序放在/usr/bin
超级用户才能使用的应用程序放在/usr/sbin
所有用户都可用的与本地机器无关的程序存放在/usr/local/bin
超级用户才能使用的与本地机器无关的程序存放在/usr/local/sbin

静态链接 和 动态链接

  1. 静态链接
      • 静态库文件: 通常以.a(在Unix/Linux系统上)或.lib(在Windows上)为扩展名,例如 my_library.amy_library.lib
      • 目标文件: 这是编译后的中间文件,通常以.o(在Unix/Linux系统上)或.obj(在Windows上)为扩展名,例如 my_code.omy_code.obj
  1. 动态链接
      • 动态链接库文件(共享库): 通常以.so(在Unix/Linux系统上)或.dll(在Windows上)为扩展名,例如 my_library.somy_library.dll
      • 目标文件: 同样以.o(在Unix/Linux系统上)或.obj(在Windows上)为扩展名,例如 my_code.omy_code.obj,但它们通常是库的一部分,供编译动态链接库时使用。
.o 文件包含了编译后的源代码的二进制表示,每个源代码文件(.c 或 .cpp 文件)通常都会生成一个对应的 .o 文件。.a 文件和.so文件,通常包含了多个 .o 文件的集合
 

Comments