【问题标题】:Eclipse CDT error: "Symbol 'XXX' could not be resolved"Eclipse CDT 错误:“无法解析符号‘XXX’”
【发布时间】:2013-12-01 19:48:33
【问题描述】:

我有一个嵌入式 C 项目,可以在控制台上使用 make 构建和运行良好,但 Eclipse CDT 给我错误。

在main.c中,这个函数使用了一个宏,APP_BUTTON_INIT:

static void buttons_init(void)
{
    static app_button_cfg_t buttons[] =
    {
        {SIGNAL_ALERT_BUTTON,           false, NRF_GPIO_PIN_NOPULL, button_event_handler},
        {BONDMNGR_DELETE_BUTTON_PIN_NO, false, NRF_GPIO_PIN_NOPULL, NULL}
    };

    APP_BUTTON_INIT(buttons, sizeof(buttons) / sizeof(buttons[0]), BUTTON_DETECTION_DELAY, false);
}

APP_BUTTON_INIT 宏在app_button.h 中定义如下:

#define APP_BUTTON_INIT(BUTTONS, BUTTON_COUNT, DETECTION_DELAY, USE_SCHEDULER)                     \
do                                                                                             \
{                                                                                              \
    uint32_t ERR_CODE = app_button_init((BUTTONS),                                             \
                                        (BUTTON_COUNT),                                        \
                                        (DETECTION_DELAY),                                     \
                                        (USE_SCHEDULER) ? app_button_evt_schedule : NULL);     \
    APP_ERROR_CHECK(ERR_CODE);                                                                 \
} while (0)

错误是

Symbol 'app_button_evt_schedule' could not be resolved

但该函数在同一个头文件app_button.h中进一步定义:

static __INLINE uint32_t app_button_evt_schedule(app_button_handler_t button_handler,
                                             uint8_t              pin_no)
{
    app_button_event_t buttons_event;

    buttons_event.button_handler = button_handler;
    buttons_event.pin_no         = pin_no;

    return app_sched_event_put(&buttons_event, sizeof(buttons_event), app_button_evt_get);
}

我已经尝试过 Project 右键单击​​ -> 索引 -> 重建和刷新所有文件,没有任何乐趣。我正在使用带有 CDT 8.2.1 的 Eclipse Kepler SR1。为什么Eclipse看不到这个功能?

Makefile 的第一个操作是这样的(可行):

mkdir _build
"/Users/Eliot/dev/gcc-arm/bin/arm-none-eabi-gcc" -DNRF51822_QFAA_CA -mcpu=cortex-m0 -mthumb -mabi=aapcs -DNRF51 -DBOARD_NRF6310 -DNRF51822_QFAA_CA --std=gnu99 -Wall -Werror -mfloat-abi=soft -DDEBUG -g3 -O0 -I"/Users/Eliot/dev/nrf51822/Include/ble" -I"/Users/Eliot/dev/nrf51822/Include/ble/softdevice" -I"/Users/Eliot/dev/nrf51822/Include/app_common" -I"/Users/Eliot/dev/nrf51822/Include/ble/ble_services" -I"../" -I"/Users/Eliot/dev/nrf51822/Include" -I"/Users/Eliot/dev/nrf51822/Include/gcc" -I"/Users/Eliot/dev/nrf51822/Include/ext_sensors" -M ../main.c -MF "_build/main.d" -MT _build/main.o

我的 CDT 项目配置的包含、符号和工具链的屏幕截图在这里:

https://dl.dropboxusercontent.com/u/12173473/screenshot_cdt_includes.png https://dl.dropboxusercontent.com/u/12173473/screenshot_cdt_symbols.png https://dl.dropboxusercontent.com/u/12173473/screenshot_cdt_toolchain.png

我没有使用工具链,因为我的项目最初是硬件制造商 (Nordic Semiconductor) 的示例 CDT 项目,并且该项目也没有配置工具链。老实说,我怀疑 CDT 是否找到了正确的 gcc 可执行文件。

【问题讨论】:

  • 将 app_button_evt_schedule 函数移到 APP_BUTTON_INIT 之前,或者提供前向声明。
  • 将 app_button_evt_schedule 移到标题中的 APP_BUTTON_INIT 之前没有效果。
  • 我会考虑检查以下解决方案:stackoverflow.com/a/24981627/1161594 为我工作。
  • 那个解决方案是指MinGW。我在 Mac 上。

标签: c eclipse eclipse-cdt


【解决方案1】:

您的 Eclipse 项目必须反映与您的 makefile 相同的行为。

将make 的输出(即对gcc 或您正在使用的任何编译器和链接器的调用)与属性> C/C++ 构建> 设置中的Eclipse 项目设置相匹配。我将开始查看包含路径 (-I) 和定义的符号 (-D),然后查看其他标志。

不幸的是,Eclipse 在从 makefile 导入项目方面并不十分聪明,也不擅长从外部构建工具解析编译器和链接器设置。

【讨论】:

    【解决方案2】:

    在没有在 Eclipse 中配置适当的工具链的情况下到处乱跑是问题所在。对于使用跨 gcc 的 ARM 开发,这个 Eclipse 插件解决了我的问题,总体上看起来很有希望。它为您提供整个工具链的 Eclipse 项目设置,这意味着您可以放弃您的 makefile。

    http://gnuarmeclipse.github.io

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2012-06-03
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多