无法替换静态库中的 __weak 函数,该函数包装在另一个具有强定义的静态库中

Can't replace __weak function in static library, which wrapped in another static library with strong definition

上下文:IAR ARM 编译器。

我正在尝试将添加的硬件库(“STM32 HAL 库”)包装到库中,然后 link 将其添加到我的可执行文件中。

如方案所示:

   /platform
    - /hal_library
    -  -  hal_source.c (with weak foo())
    -  hal_portable_source.c (with strong foo())
    -  platform.c (with strong foo())
   main.c

CMake 有这样的结构(伪代码):

    ### Hal_Library.cmake
    
    add_library(hal_lib ${HAL_SOURCES})
    target_include_directories(hal_lib ${HAL_HEADERS}

    ### Platform_Library.cmake

    include(Hal_Library.cmake)
    add_library(platform_lib ${PLATFORM_SOURCES})
    target_include_directories(platform_lib${PLATFORM_HEADERS}
    target_link_libraries(platform_lib hal_lib)

    ### CMakeLists.txt

    add_subdirectory(./platform)
    add_executable(my_app main.c)
    target_link_libraries(my_app platform_lib )

hal_source.c 包含 __weak void Foo(void) 和!在自我功能中调用它。供应商假设用户在他的代码中用强大的实现 void Foo(void) 替换了它。当您直接在可执行文件中添加 strong_foo_realization.c 时,它是有效的。

但我正在尝试用 strong_foo_realization.c 替换 platform_lib 中的它,hal_lib 被 link 编辑到

然后我明白了,什么__weak Foo()没有被我强Foo()取代。

参考 *.map 文件,从未添加 strong_foo_realization.c

我读过:

和其他主题,但似乎没有针对我的情况的答案。

我也试过:

编译器问题。 IAR 不像 GCC 那样工作。没有关于如何使其与 IAR 编译器一起工作的信息。