L5 构建系统实践参考答案
使用方式
请先独立完成构建系统实践并记录构建错误,再使用本页核对目标依赖、头文件作用域和顶层链接关系。参考答案不是唯一目录组织方式。
1、
在 buzzer/CMakeLists.txt 中填入以下代码:
cmake
# 创建一个名为 buzzer_lib 的库,源文件是 src/buzzer.c
add_library(buzzer_lib src/buzzer.c)
# 告诉 buzzer_lib 去哪里找头文件
# 使用 PUBLIC 关键字:不仅 buzzer_lib 自己编译时需要去 include/ 里找头文件
# 任何链接了 buzzer_lib 的主程序,也能顺带获得 include/ 的路径!
target_include_directories(buzzer_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
# 给buzzer_lib 添加stm32cubemx 依赖
target_link_libraries(buzzer_lib PUBLIC stm32cubemx)(注:_${CMAKE_CURRENT_SOURCE_DIR}_ 是 CMake 自带的变量,代表当前 CMakeLists.txt 所在的绝对路径,这是一种非常规范的写法)
2、
在顶层 CMakeLists.txt 的末尾(确保在 add_executable 命令之后),添加以下代码:
cmake
# 1. 告诉CMake,去 buzzer 文件夹里执行那里的 CMakeLists.txt
add_subdirectory(buzzer)
# 2. 将我们的主程序目标(${CMAKE_PROJECT_NAME})和 buzzer_lib 链接起来!
# 这样不仅把代码缝合了,主程序也就自动知道了 buzzer/include 的路径
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE buzzer_lib)3、
在 Core/Src/main.c 中:
c
/* USER CODE BEGIN Includes */
#include "buzzer.h"
/* USER CODE END Includes */
// ... 省略中间代码 ...
int main(void)
{
// ... HAL_Init() 等初始化代码 ...
/* USER CODE BEGIN 3 */
while (1)
{
// 播放 1000Hz 的声音
buzzer_play_tone(1000);
HAL_Delay(500); // 延时 500 毫秒
// 静音
buzzer_play_tone(0);
HAL_Delay(500); // 延时 500 毫秒
}
/* USER CODE END 3 */
}