首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake找不到PICO中的标头

CMake找不到PICO中的标头
EN

Stack Overflow用户
提问于 2022-09-25 00:21:04
回答 1查看 188关注 0票数 0

所以我挣扎了几个小时,却找不到解决问题的办法。有关这个问题的较详细说明如下:

因此,我根据Pico提供的示例(针对Raspberry Pi Pico)创建了一个“闪烁LED”示例。这意味着我有一个"main.c“作为我的主要源(或可执行的,就CMake而言)。但是每次我尝试将代码从main.c移动到不同的C文件(为了使整个项目更加可移植)时,我总是遇到相同的问题,即生成的C文件找不到头文件。

我尝试通过给出绝对路径对头文件进行硬编码,但是那个头也指向不同的头,问题会重复发生。

下面是源文件的文件夹结构:

代码语言:javascript
复制
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的结构:

代码语言:javascript
复制
kali:
|-pico-sdk
|-main_directory

因此,可重复的示例是(按文件)

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
#include <stdlib.h>
#include "pico/stdlib.h" // this header is being 'mapped' correctly
// ...
int main(void) { /* code */ }

然后是另一个CMakeLists.txt (来自lib/闪烁lib文件夹):

代码语言:javascript
复制
include(../../pico_sdk_import.cmake)
add_library(blinkingLED STATIC blinkingLED.c)
target_include_directories(blinkingLED PUBLIC ./ ${PICO_SDK_PATH})

闪烁的LED.c文件:

代码语言:javascript
复制
#include "pico/stdlib.h" // This line is causing the compilation failure
// ...
void foo(void) { /* using some macros and definitions from that library */ }

我得到的错误大致是:

代码语言:javascript
复制
blinkingLED.c(1:20) cannot find the file "pico/stdlib.h"
EN

回答 1

Stack Overflow用户

发布于 2022-11-04 18:01:17

范围在CMAKE中是一件棘手的事情。如果你想多读一些书的话,这里有一个很好的解释。

对于顶级CMAKELists.txt文件,您的目标是链接可移植库,而不是将其作为freeRTOS库源代码的一部分进行编译。将库的目录添加到target_include_directories中,将CMAKElists.txt库的CMAKElists.txt添加到CMAKE构建树中。通过CMAKElists.txt blinkingLED通过target_link_libraries链接创建的目标可以提供对可执行目标的访问。这些变化看起来是这样的。

代码语言:javascript
复制
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的源文件中。

代码语言:javascript
复制
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
                      )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73841371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档