CMake小结2(PICO为例)

1 前言

之前写过一篇cmake,不过很简单:CMake小结_cmake ${sources}-CSDN博客

构建系统现在真的太多了,完全学不过来的感觉,meson,gardle,buildroot, Maven。。。我是真的有点放弃治疗了。之前其实CMake主打过一阵,不过那时还忙着GT的事情,所以基本上是混过来的。也没有太认真去看。

最近在看FreeRTOS,用的板子是pico,首当其冲遇到的问题就是编译环境,没想到这里用的也是CMake,前两天尝试增加了一点东西,但是报错很多。看来这次这玩意是绕不开了,结合树莓派的手册,这次就详细再看看吧。有个实际的高手的项目看,也比自己瞎学强多了。。

手册来自:https://github.com/raspberrypi/pico-sdk

具体位置是:https://rptl.io/pico-get-started

2 PICO样例工程

手册里面有一章节专门说到了怎么手动配置一个工程,Manually Create your own Project。因为是官方手册,所以说的也非常详细。

 代码如下:

test.c

#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "pico/binary_info.h"const uint LED_PIN = 25;int main()
{bi_decl(bi_program_description("This is a test binary."));bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));stdio_init_all();gpio_init(LED_PIN);gpio_set_dir(LED_PIN, GPIO_OUT);while (1) {gpio_put(LED_PIN, 0);sleep_ms(250);gpio_put(LED_PIN, 1);puts("Hello World\n");sleep_ms(1000);}
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)project(test_project C CXX ASM)set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)pico_sdk_init()
add_executable(test test.c)pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 1)
pico_add_extra_outputs(test)target_link_libraries(test pico_stdlib)

最后要从pico的sdk中拷贝一个文件过来。

pico_sdk_import.cmake

原始位置是在/pico-sdk/external/pico_sdk_import.cmake

此时结构如下:

创建一个build,cmake..,然后make

对了,这里说个题外话,每次编译的时候,都说找不到picotool,所以编译工具会自己去下载,但是github在国内的稳定性大家是知道的,所以尝尝编译报错都是因为这个下不下来。所以可以先安装picotool。

git clone https://github.com/raspberrypi/picotool.git
mkdir build
cd build
cmake ..
make
make install

cmake ..

tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ cmake ..
Using PICO_SDK_PATH from environment ('/mnt/e/test/pico/pico-sdk')
PICO_SDK_PATH is /mnt/e/test/pico/pico-sdk
Initializing PICO_PLATFORM from environment ('rp2040')
Defaulting target board (PICO_BOARD) to 'pico' since not specified.
Using board configuration from /mnt/e/test/pico/pico-sdk/src/boards/include/boards/pico.h
Pico Platform (PICO_PLATFORM) is 'rp2040'.
-- Defaulting build type to 'Release' since not specified.
Defaulting compiler (PICO_COMPILER) to 'pico_arm_cortex_m0plus_gcc' since not specified.
Configuring toolchain based on PICO_COMPILER 'pico_arm_cortex_m0plus_gcc'
Defaulting PICO_GCC_TRIPLE to 'arm-none-eabi'
-- The C compiler identification is GNU 13.2.1
-- The CXX compiler identification is GNU 13.2.1
-- The ASM compiler identification is GNU
-- Found assembler: /usr/bin/arm-none-eabi-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/arm-none-eabi-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/arm-none-eabi-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Build type is Release
-- Found Python3: /usr/bin/python3 (found version "3.12.3") found components: Interpreter
TinyUSB available at /mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040; enabling build support for USB.
BTstack available at /mnt/e/test/pico/pico-sdk/lib/btstack
cyw43-driver available at /mnt/e/test/pico/pico-sdk/lib/cyw43-driver
lwIP available at /mnt/e/test/pico/pico-sdk/lib/lwip
mbedtls available at /mnt/e/test/pico/pico-sdk/lib/mbedtls
-- Configuring done (7.6s)
-- Generating done (6.3s)
-- Build files have been written to: /mnt/e/test/pico/test/build

make

tom@PC-20241221RKUQ:/mnt/e/test/pico/test/build$ make
[  1%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.o
[  2%] Linking ASM executable bs2_default.elf
[  2%] Built target bs2_default
[  3%] Generating bs2_default.bin
[  4%] Generating bs2_default_padded_checksummed.S
[  5%] Building ASM object pico-sdk/src/rp2040/boot_stage2/CMakeFiles/bs2_default_library.dir/bs2_default_padded_checksummed.S.o
[  5%] Built target bs2_default_library
make[2]: Warning: File 'CMakeFiles/test.dir/depend.make' has modification time 0.5 s in the future
[  6%] Building C object CMakeFiles/test.dir/test.c.o
[  7%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.o
[  9%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.o
[ 10%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2040/pico_platform/platform.c.o
[ 11%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_platform_panic/panic.c.o
[ 12%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/hardware_claim/claim.c.o
[ 13%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_sync/sync.c.o
[ 14%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_sync_spin_lock/sync_spin_lock.c.o
[ 15%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq.c.o
[ 17%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_irq/irq_handler_chain.S.o
[ 18%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/sem.c.o
[ 19%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/lock_core.c.o
[ 20%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/mutex.c.o
[ 21%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_sync/critical_section.c.o
[ 22%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/time.c.o
[ 23%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_time/timeout_helper.c.o
[ 25%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_timer/timer.c.o
[ 26%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/datetime.c.o
[ 27%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/pheap.c.o
[ 28%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/common/pico_util/queue.c.o
[ 29%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_uart/uart.c.o
[ 30%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_clocks/clocks.c.o
[ 31%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_pll/pll.c.o
[ 32%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_vreg/vreg.c.o
[ 34%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_watchdog/watchdog.c.o
[ 35%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_ticks/ticks.c.o
[ 36%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom.c.o
[ 37%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bootrom/bootrom_lock.c.o
[ 38%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_boot_lock/boot_lock.c.o
[ 39%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_flash/flash.c.o
[ 40%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xosc/xosc.c.o
[ 42%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_divider/divider.S.o
[ 43%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime/runtime.c.o
[ 44%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init.c.o
[ 45%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init_clocks.c.o
[ 46%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_runtime_init/runtime_init_stack_guard.c.o
[ 47%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S.o
[ 48%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_divider/divider_hardware.S.o
[ 50%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_aeabi_rp2040.S.o
[ 51%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_init_rom_rp2040.c.o
[ 52%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_math.c.o
[ 53%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_double/double_v1_rom_shim_rp2040.S.o
[ 54%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S.o
[ 55%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_aeabi_rp2040.S.o
[ 56%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_init_rom_rp2040.c.o
[ 57%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_math.c.o
[ 59%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_float/float_v1_rom_shim_rp2040.S.o
[ 60%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_malloc/malloc.c.o
[ 61%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.o
[ 62%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_atomic/atomic.c.o
[ 63%] Building CXX object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_cxx_options/new_delete.cpp.o
[ 64%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_standard_binary_info/standard_binary_info.c.o
[ 65%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_printf/printf.c.o
[ 67%] Building ASM object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_crt0/crt0.S.o
[ 68%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_clib_interface/newlib_interface.c.o
[ 69%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.o
[ 70%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.o
[ 71%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/reset_interface.c.o
[ 72%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c.o
[ 73%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c.o
[ 75%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_unique_id/unique_id.c.o
[ 76%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_flash/flash.c.o
[ 77%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/hardware_xip_cache/xip_cache.c.o
[ 78%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c.o
[ 79%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c.o
[ 80%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd.c.o
[ 81%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/device/usbd_control.c.o
[ 82%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/audio/audio_device.c.o
[ 84%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/cdc/cdc_device.c.o
[ 85%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_device.c.o
[ 86%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c.o
[ 87%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/hid/hid_device.c.o
[ 88%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/midi/midi_device.c.o
[ 89%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/msc/msc_device.c.o
[ 90%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c.o
[ 92%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/net/ncm_device.c.o
[ 93%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c.o
[ 94%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/vendor/vendor_device.c.o
[ 95%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/class/video/video_device.c.o
[ 96%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/tusb.c.o
[ 97%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/lib/tinyusb/src/common/tusb_fifo.c.o
[ 98%] Building C object CMakeFiles/test.dir/mnt/e/test/pico/pico-sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c.o
[100%] Linking CXX executable test.elf
make[2]: warning:  Clock skew detected.  Your build may be incomplete.
[100%] Built target test

好了,看来这个cmake里面干的事情还不少。

3 再看CMake

 CMake的基本原理这里就不多说了,其实就是一个构建脚本的再抽象。

官网上有一个详细的教程:

https://cmake.org/cmake/help/latest/_downloads/feee7c51d38ca0ca2395c3e89ac3d30e/cmake-4.0.0-rc2-tutorial-source.zip

CMake Tutorial — CMake 4.0.0-rc2 Documentation

他家还有一个网课,不过现在貌似是关闭了。

CMake Training

对于CMake的重点是那个CMakeLists.txt,下面列了我觉得最常用几个,完了命令行再看看大体也差不多了。

名称作用
cmake_minimum_required(VERSION <min_version>)指定项目所需的最低 CMake 版本
project(<project_name> [LANGUAGES <language>...])定义项目名称和使用的编程语言
add_executable(<target_name> <source_files>...)添加一个可执行文件目标,并指定其源文件
add_library(<target_name> [STATIC | SHARED | MODULE] <source_files>...)添加一个库目标,可以是静态库、动态库或模块库
target_link_libraries(<target_name> <libraries>...)指定目标需要链接的库
include_directories(<dir>...)添加头文件搜索路径
target_include_directories(<target_name> <INTERFACE|PUBLIC|PRIVATE> <dir>...)为特定目标添加头文件搜索路径
add_subdirectory(<source_dir> [binary_dir])添加子目录,子目录必须包含CMakeLists.txt 文件
set(<variable> <value> [CACHE <type> <docstring> [FORCE]])设置变量的值
add_definitions(<definitions>...)添加预处理器定义
add_custom_target(<target_name> [ALL] [command]...)添加一个自定义目标,通常用于执行自定义命令
message([<mode>] "message text")打印消息,用于调试或信息输出

详细的命令说明可以看:cmake-commands(7) — CMake 4.0.0-rc2 Documentation

4 PICO样例工程分析

因为这次的重心不是代码,所以这里代码就不看了。

重点还是CMakeLists.txt,这次一行一行的过。

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)project(test_project C CXX ASM)set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)pico_sdk_init()
add_executable(test test.c)pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 1)
pico_add_extra_outputs(test)target_link_libraries(test pico_stdlib)

从列表来看,PICO是自己扩展了不少函数,重点要看的就是include(pico_sdk_import.cmake),pico_sdk_init(),pico_add_extra_outputs(test)。至于pico_enable_stdio_usb(test 1),pico_enable_stdio_uart(test 1)感觉就是两个宏定义。

include(pico_sdk_import.cmake)

这个主要是配置pico的路径,如果没有配置PICO_SDK_PATH,会直接从github去下载。真正的初始化,是后面include pico_sdk_init.cmake。在这里,就定义了这个宏ico_sdk_init()。

    macro(pico_sdk_init)if (NOT CMAKE_PROJECT_NAME)message(WARNING "pico_sdk_init() should be called after the project is created (and languages added)")endif()add_subdirectory(${PICO_SDK_PATH} pico-sdk)endmacro()

这里就是包含了pico-sdk里面的第一个CMakeLists.txt。和我们一般使用库不同,一般就是只要头文件,然后静态或者动态链接。这里是相当于你编译一个小程序,实际上也是把整个pico-sdk加进来了的。

至于pico_add_extra_outputs(test)。

这个的定义是在:pico-sdk/src/cmake/on_device.cmake,这个是一个function定义,不是之前的macro。

function(pico_add_extra_outputs TARGET)# Disassembly will be nonsense for encrypted binaries,# so disassemble before picotool processingpico_add_dis_output(${TARGET})# Picotool processing (signing/encrypting/etc)# PICO_CMAKE_CONFIG: PICO_NO_PICOTOOL, Disable use/requirement for picotool meaning that UF2 output and signing/hashing and coprocoessor disassembly will all be unavailable, type=bool, default=0, group=buildif (NOT PICO_NO_PICOTOOL)picotool_postprocess_binary(${TARGET} IS_ENCRYPTED)endif()if (PICO_32BIT)pico_add_hex_output(${TARGET})endif()pico_add_bin_output(${TARGET})pico_add_map_output(${TARGET})# PICO_CMAKE_CONFIG: PICO_NO_TARGET_NAME, Don't define PICO_TARGET_NAME, type=bool, default=0, group=build# PICO_BUILD_DEFINE: PICO_TARGET_NAME, Name of the build target being compiled (unless PICO_NO_TARGET_NAME set in build), type=string, default=target name, group=buildif (NOT PICO_NO_TARGET_NAME)target_compile_definitions(${TARGET} PRIVATEPICO_TARGET_NAME="${TARGET}")endif()if (PICO_SYMLINK_ELF_AS_FILENAME)add_custom_target(${TARGET}_symlinked)add_dependencies(${TARGET}_symlinked ${TARGET})add_custom_command(TARGET ${TARGET}_symlinked POST_BUILDCOMMAND rm -f "${PICO_SYMLINK_ELF_AS_FILENAME}"COMMAND ln -s -r $<TARGET_FILE:${TARGET}> "${PICO_SYMLINK_ELF_AS_FILENAME}"COMMENT "Symlinking from ${PICO_SYMLINK_ELF_AS_FILENAME} to ${TARGET}")endif ()# PICO_CMAKE_CONFIG: PICO_NO_UF2, Disable UF2 output, type=bool, default=0, group=buildif (NOT (PICO_NO_UF2 OR PICO_NO_PICOTOOL))pico_add_uf2_output(${TARGET})endif()
endfunction()

这里还包含了很多个其它的函数,大体就是将编译的程序最后转换成可以在板子上运行的uf2格式。

5 增加FreeRTOS支持

回到之前的那一篇:RTOS基础1(FreeRTOS+树莓派PICO环境)-CSDN博客

看看里面加了什么。

 增加了自己的一个freertos,还有一个pico_sdk_import.cmake。

它的CMakeLists.txt是这样的

cmake_minimum_required(VERSION 3.12)include(pico_sdk_import.cmake)project(Pico-FreeRTOS)pico_sdk_init()add_subdirectory(freertos)
add_subdirectory(ProjectFiles)

多出来的一句就是add_subdirectory(freertos)

再看看子CMakeLists.txt,也就是ProjectFiles里面的。

add_executable(blink main.c)pico_sdk_init()target_link_libraries(blink pico_stdlib freertos)
pico_add_extra_outputs(blink)

其实就是一个,target_link_libraries(blink pico_stdlib freertos),增加链接freertos的库就可以了。

好吧,好像确实也不难哈。明天再继续试试。。。

6 小结

CMake的东西确实比我想的要多多了。

个人觉得,实际上它有两个很大的作用。

1 就是跨平台的构建。比如说一套编译脚本,可以在linux,苹果,windows下都搞定了。这个之前都知道。

2  针对自动化构建,做了很多内容。比如创建宏或者函数,处理github下载这些,这些以前的makefile确实解决这些不那么方便。这部分CMake几乎是增加了半套语言。。。当然,如果能换成python语言就更好了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24658.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用OpenCV实现帧间变化检测:基于轮廓的动态区域标注

在计算机视觉中&#xff0c;帧间差异检测&#xff08;frame differencing&#xff09;是一种常用的技术&#xff0c;用于检测视频流中的动态变化区域。这种方法尤其适用于监控、运动分析、目标追踪等场景。在这篇博客中&#xff0c;我们将通过分析一个基于OpenCV的简单帧间差异…

机器学习01

机器学习的基本过程如下&#xff1a; 1.数据获取 2.数据划分 3.特征提取 4.模型选择与训练 5.模型评估 6.模型调优 一、特征工程&#xff08;重点&#xff09; 0. 特征工程步骤为&#xff1a; 特征提取(如果不是像dataframe那样的数据&#xff0c;要进行特征提取&#…

每日Attention学习24——Strip Convolution Block

模块出处 [TIP 21] [link] CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery 模块名称 Strip Convolution Block (SCB) 模块作用 多方向条形特征提取 模块结构 模块特点 类PSP设计&#xff0c;采用四个并行分支提取不同维度的信息相比于…

用FileZilla Server 1.9.4给Windows Server 2025搭建FTP服务端

FileZilla Server 是一款免费的开源 FTP 和 FTPS 服务器软件&#xff0c;分为服务器版和客户端版。服务器版原本只支持Windows操作系统&#xff0c;比如笔者曾长期使用过0.9.60版&#xff0c;那时候就只支持Windows操作系统。当时我们生产环境对FTP稳定性要求较高&#xff0c;比…

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用

健康检查、k8s探针、Grails+Liquibase框架/health 404 Not Found排查及解决

概述 健康检查对于一个pod而言&#xff0c;其重要性不言而喻。 k8s通过探针来实现健康检查。 探针 k8s提供三种探针&#xff1a; 存活探针&#xff1a;livenessProbe就绪探针&#xff1a;readinessProbe启动探针&#xff1a;startupProbe 存活探针 存活探针决定何时重启…

5个GitHub热点开源项目!!

1.自托管 Moonlight 游戏串流服务&#xff1a;Sunshine 主语言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增长&#xff1a;500 这是一个自托管的 Moonlight 游戏串流服务器端项目&#xff0c;支持所有 Moonlight 客户端。用户可以在自己电脑上搭建一个游戏…

【Linux C | 时间】localtime 的介绍、死机、死锁问题以及 localtime_r 函数的时区问题

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

122. 买卖股票的最佳时机 II 反向递推的方法

下面是将你提供的代码整理成一篇Markdown格式的博客内容&#xff1a; 股票买卖的最大利润 问题描述 给定一个整数数组 prices&#xff0c;其中 prices[i] 是股票在第 i 天的价格。你可以选择在某一天买入股票&#xff0c;并在之后的某一天卖出股票。要求计算出你能够获得的最…

详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)

目录 步骤一&#xff1a;首先确认自己是否已经安装JDK步骤二&#xff1a;下载安装Tomcat步骤三&#xff1a;Tomcat配置环境变量步骤四&#xff1a;验证Tomcat配置是否成功步骤五&#xff1a;为IDEA配置Tomcat 步骤一&#xff1a;首先确认自己是否已经安装JDK jdk各版本通用安…

html中的css

css &#xff08;cascading style sheets&#xff0c;串联样式表&#xff0c;也叫层叠样式表&#xff09; css规范一般约定&#xff1a; 1.存放CSS样式文件的目录一般命名为style或css。 2.在项目初期&#xff0c;会把不同类别的样式放于不同的CSS文件&#xff0c;是为了CSS编…

前端项目配置初始化

creat-vue 安装 https://cn.vuejs.org/guide/quick-start.html 官网复制npm安装语句 cmd窗口创建文件夹 npm create vue3.12.2安装webstorm启动vue项目 https://www.jetbrains.com/webstorm/download/other.html 2024.3.2.1 安装依赖 下载包node_modules package 运行服…

Java注解的原理

目录 问题: 作用&#xff1a; 原理&#xff1a; 注解的限制 拓展&#xff1a; 问题: 今天刷面经&#xff0c;发现自己不懂注解的原理&#xff0c;特此记录。 作用&#xff1a; 注解的作用主要是给编译器看的&#xff0c;让它帮忙生成一些代码&#xff0c;或者是帮忙检查…

seacmsv9注入管理员账号密码+orderby+limit

seacmsv9注入管理员账号密码 安装海洋CMS&#xff08;seacms&#xff09; 将upload文件夹里的文件全部上传至网页服务器后&#xff0c;执行以下操作: 请运行http://域名/install/index.php进行程序安装 SQL语句尝试注入 http://127.0.0.1/upload/comment/api/index.php?g…

【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中&#xff0c;BuildConfig是一个非常有用的功能&#xff0c;它允许我们在构建过程中定义常量&#xff0c;并在运行时使用它们。But&#xff01;&#xff01;当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候&#xff0c;有一些细微的差…

AI如何改变传统工厂的生产模式?

随着第四次工业革命的浪潮席卷全球&#xff0c;制造业的数字化转型成为企业在竞争中脱颖而出的关键。过去&#xff0c;传统制造业往往依赖于大量的人工操作和低效率的管理流程&#xff0c;而如今&#xff0c;智能化、自动化、数据化已经成为未来制造业的必由之路。从车间到云端…

Redis

redis启动命令 默认端口启动redis&#xff1a; redis-server redis.windows.conf 指定端口9001和9002启动redis(需要新建配置文件&#xff0c;并修改配置文件port属性)&#xff1a; redis-server .\redis-9001.conf redis-server .\redis-9002.conf 检查是否启动Redis &#…

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大&#xff0c;同一列中下边的比上边的大。一共有多少种方案? 答案很大&#xff0c;你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …

ARM 处理器平台 eMMC Flash 存储磨损测试示例

By Toradex秦海 1). 简介 目前工业嵌入式 ARM 平台最常用的存储器件就是 eMMC Nand Flash 存储&#xff0c;而由于工业设备一般生命周期都比较长&#xff0c;eMMC 存储器件的磨损寿命对于整个设备来说至关重要&#xff0c;因此本文就基于 NXP i.MX8M Mini ARM 处理器平台演示…

14.二叉搜索树

二叉搜索树 1.概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: *若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 *若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结点…