所以我挣扎了几个小时,却找不到解决问题的办法。有关这个问题的较详细说明如下:
因此,我根据Pico提供的示例(针对Raspberry Pi Pico)创建了一个“闪烁LED”示例。这意味着我有一个"main.c“作为我的主要源(或可执行的,就CMake而言)。但是每次我尝试将代码从main.c移动到不同的C文件(为了使整个项目更加可移植)时,我总是遇到相同的问题,即生成的C文件找不到头文件。
我尝试通过给出绝对路径对头文件进行硬编码,但是那个头也指向不同的头,问题会重复发生。
下面是源文件的文件夹结构:
main_directory:
├── build
├── CMakeLists.txt
├── FreeRTOS-Kernel
├── include
│ ├── FreeRTOSConfig.h
│ └── main.h
├── lib
│ ├── blinkingLED
│ │ ├── blinkingLED.c <~ CMake fails in this file
│ │ ├── blinkingLED.h
│ │ └── CMakeLists.txt
│ └── serial
├── pico_sdk_import.cmake
├── src
└── main.c以及pico的结构:
kali:
|-pico-sdk
|-main_directory因此,可重复的示例是(按文件)
CMakeLists.txt (principal):
cmake_minimum_required(VERSION 3.19)
include(pico_sdk_import.cmake)
project(FRTOSTest C CXX ASM)
pico_sdk_init()
add_executable(FRTOSTest src/main.c)
FILE(GLOB FreeRTOS_src FreeRTOS-Kernel/*.c)
add_library(FreeRTOS STATIC ${FreeRTOS_src}
FreeRTOS-Kernel/portable/GCC/ARM_CM0/port.c
FreeRTOS-Kernel/portable/MemMang/heap_4.c
src/blinkingLED.c)
target_include_directories(FreeRTOS PUBLIC FreeRTOS-Kernel/include
include/
FreeRTOS-Kernel/portable/GCC/ARM_CM0/)
target_link_libraries(FRTOSTest
pico_stdlib
hardware_gpio
FreeRTOS)
pico_enable_stdio_usb(FRTOSTest 1)
pico_enable_stdio_uart(FRTOSTest 0)
pico_add_extra_outputs(FRTOSTest)main.c文件:
#include <stdlib.h>
#include "pico/stdlib.h" // this header is being 'mapped' correctly
// ...
int main(void) { /* code */ }然后是另一个CMakeLists.txt (来自lib/闪烁lib文件夹):
include(../../pico_sdk_import.cmake)
add_library(blinkingLED STATIC blinkingLED.c)
target_include_directories(blinkingLED PUBLIC ./ ${PICO_SDK_PATH})闪烁的LED.c文件:
#include "pico/stdlib.h" // This line is causing the compilation failure
// ...
void foo(void) { /* using some macros and definitions from that library */ }我得到的错误大致是:
blinkingLED.c(1:20) cannot find the file "pico/stdlib.h"发布于 2022-11-04 18:01:17
范围在CMAKE中是一件棘手的事情。如果你想多读一些书的话,这里有一个很好的解释。
对于顶级CMAKELists.txt文件,您的目标是链接可移植库,而不是将其作为freeRTOS库源代码的一部分进行编译。将库的目录添加到target_include_directories中,将CMAKElists.txt库的CMAKElists.txt添加到CMAKE构建树中。通过CMAKElists.txt blinkingLED通过target_link_libraries链接创建的目标可以提供对可执行目标的访问。这些变化看起来是这样的。
CMakeLists.txt (principal):
cmake_minimum_required(VERSION 3.19)
include(pico_sdk_import.cmake)
project(FRTOSTest C CXX ASM)
pico_sdk_init()
add_executable(FRTOSTest src/main.c)
FILE(GLOB FreeRTOS_src FreeRTOS-Kernel/*.c)
add_library(FreeRTOS STATIC ${FreeRTOS_src}
FreeRTOS-Kernel/portable/GCC/ARM_CM0/port.c
FreeRTOS-Kernel/portable/MemMang/heap_4.c
)
target_include_directories(FreeRTOS PUBLIC FreeRTOS-Kernel/include
include/
FreeRTOS-Kernel/portable/GCC/ARM_CM0/
lib/blinkingLED
)
target_link_libraries(FRTOSTest
pico_stdlib
hardware_gpio
FreeRTOS
blinkingLED
)
pico_enable_stdio_usb(FRTOSTest 1)
pico_enable_stdio_uart(FRTOSTest 0)
pico_add_extra_outputs(FRTOSTest)对于blinkingLED CMAKElists.txt文件,需要确保在其范围内提供pico。这需要用target_link_libraries来完成。您之前尝试的是将picoSDK源目录添加到blinkingLED的源文件中。
include(../../pico_sdk_import.cmake)
add_library(blinkingLED STATIC blinkingLED.c)
target_sources(blinkingLED
"blinkingLED.h"
"blinkingLED.c"
)
target_link_libraries(blinkingLED LINK_PUBLIC
pico_stdlib
hardware_gpio
)https://stackoverflow.com/questions/73841371
复制相似问题