链接器找不到实现,因为编译器定义未在源代码中求值

问题描述 投票:0回答:1

我正在尝试将 this 库添加到 Visual Studio Code 中的 ESP-IDF 应用程序(使用 PlatformIO)。

这是我所做的步骤:

  1. 使用 Espressif 扩展中的“新建项目向导”创建了一个新项目,选择 ESP32-S3 作为目标
  2. 构建空项目来检查工具链是否正常
  3. 在我的项目根目录的
    components/components/
    文件夹下下载了上述库
  4. main.cpp
    中添加一些代码:
#define EVE_CS GPIO_NUM_47
#define EVE_PDN GPIO_NUM_11
#define EVE_SCK GPIO_NUM_19
#define EVE_MISO GPIO_NUM_20
#define EVE_MOSI GPIO_NUM_21    
#define EVE_NHD_50

#include <stdio.h>
#include "../components/components/FT800-FT813-5.x/src/EVE.h"

void app_main(void)
{
    EVE_init_spi();
}

现在,链接器失败了:

/home/mark/myproject/main/main.c:14:(.text.app_main+0x3):对“EVE_init_spi”的未定义引用

图书馆的自述文件说:

通过 EVE_target.h 中的编译器标志自动检测代码编译的平台

确实,在里面

EVE_target.h
我看到:

#if defined (ESP_PLATFORM)
#include "EVE_target/EVE_target_ESP32.h"
#endif /* ESP_PLATFORM */

ESP_PLAFTORM
定义为 1(我可以看到它悬停在鼠标上并出现工具提示)。然后我按照
EVE_target_ESP32.h
进行操作,并在那里定义了平台。但是
void EVE_init_spi(void);
的实现位于
EVE_target.c
内部,并且在该文件
ESP_PLAFORM
未定义。

因此,与 ESP32(甚至其他平台)相关的所有代码都未启用,我猜这就是链接器错误的原因。

由于我将库文件夹放入

components

 目录中,我预计它已经由 CMake 处理。顺便说一句,这些是顶级和代码级 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(myproject)

idf_component_register(SRCS "main.c" INCLUDE_DIRS ".")
我发现

ESP_PLATFORM

是由Ninja脚本在调用编译器时定义的:

DEFINES = -DESP_PLATFORM
我还应该设置什么才能使 

ESP_PLATFORM

 也可用于 
EVE_target.c

c cmake esp-idf espressif-idf
1个回答
0
投票
该组件缺少与 ESP-IDF 构建系统交互的

CMakeLists.txt

 文件。

请根据

ESP-IDF 构建系统组件文档

在您的 
FT800-FT813-5.x 目录中添加 CMakeLists.txt 文件。这包含 idf_component_register()
 调用,并将确保构建源文件并正确设置包含路径等。

之后,需要将

main

组件的
CMakeLists.txt
文件中的调用更改为:

idf_component_register(SRCS "main.c" INCLUDE_DIRS "." PRIV_REQUIRES "FT800-FT813-5.x")
我还建议删除双

components

目录,我不确定构建系统是否仍然可以识别当前结构中的组件。

© www.soinside.com 2019 - 2024. All rights reserved.