【问题标题】:__attribute__((weak) ) function result in undefined reference__attribute__((weak) ) 函数导致未定义的引用
【发布时间】:2019-08-09 23:24:55
【问题描述】:

我目前正在尝试设置 CMock 以使用 MinGW 和 CMake 对 STM32 进行单元测试。在我的配置文件中,我设置了 :weak: 选项,这样生成的模拟就会给我弱功能。一个例子是:

#if defined (__IAR_SYSTEMS_ICC__)
#pragma weak HAL_TIM_IC_Init
#else
HAL_StatusTypeDef  __attribute__((weak)) HAL_TIM_IC_Init(TIM_HandleTypeDef* htim);
#endif

HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef* htim)
{
  ...
}

但是,当我编译时,它给了我对 HAL_TIM_IC_Init 错误的未定义引用。

如果我删除 weak 属性,那么它不会给我未定义的引用错误。但是因为需要重写HAL层提供的一些函数,所以需要将mocked库设为weak,否则会出现多个定义错误。

所以我的问题是为什么弱属性会导致未定义的引用错误,我该如何解决?

【问题讨论】:

  • 发布链接命令。检查库的顺序。提示:target_link_libraries(target -Wl,-whole-archive LIBS_HERE -Wl,-no-whole-archive) 或 target_link_libraries(target LIBS_HERE REPEAT_ALL_THE_LIBS_AGAIN)
  • 你说的我试过了,但是没用。 add_library(mockLibrary STATIC ${LIB_SOURCES}) 然后TARGET_LINK_LIBRARIES(TestPortTimer mockLibrary mockLibrary) 链接库来源由file(GLOB LIB_SOURCES LIST_DIRECTORIES true ...)找到
  • 仅供参考,如果我删除 HAL_StatusTypeDef __attribute__((weak)) HAL_TIM_IC_Init(TIM_HandleTypeDef* htim); 声明行或只是删除 __attribute__((weak)),那么问题就会消失。但我不想手动执行,因为文件是自动生成的。那么这里有什么问题呢?

标签: c stm32 weak-linking cmock


【解决方案1】:

显然,MinGW 不支持弱属性。当我移动到 ubuntu 时就可以了。

不确定我是否正确,但对于 MinGW 的弱属性可能还有一个替代方法,即使用 __declspec(selectany),但它似乎只适用于变量,因为当我应用到函数时它给我这个错误'selectany'属性仅适用于具有外部链接的初始化变量

【讨论】:

  • __declspec(selectany) 仅适用于初始化变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2012-10-06
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多