无法替换静态库中的 __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
。
我读过:
和其他主题,但似乎没有针对我的情况的答案。
我也试过:
--whole_archive
没有帮助
- 将
hal_lib
中的所有来源添加到 platform_lib
(并完全删除 hal_lib
)。没用
- 改变link命令中
hal_portable_source.c.o
的位置。没用
- 图书馆也一样。
编译器问题。 IAR 不像 GCC 那样工作。没有关于如何使其与 IAR 编译器一起工作的信息。
上下文: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
。
我读过:
和其他主题,但似乎没有针对我的情况的答案。
我也试过:
--whole_archive
没有帮助- 将
hal_lib
中的所有来源添加到platform_lib
(并完全删除hal_lib
)。没用 - 改变link命令中
hal_portable_source.c.o
的位置。没用 - 图书馆也一样。
编译器问题。 IAR 不像 GCC 那样工作。没有关于如何使其与 IAR 编译器一起工作的信息。