我在两个静态库libA和libB之间存在循环依赖关系。
在生成构建配置时,CMake尝试通过将
add_library(LibA STATIC a.c)
add_library(LibB STATIC b.c)
# Circular dependency: LibA <-> LibB
target_link_libraries(LibA PRIVATE LibB)
target_link_libraries(LibB PRIVATE LibA)
add_executable(Example main.c)
target_link_libraries(Example PRIVATE LibA LibB)
在生成构建配置时,CMake尝试通过将
LibA
和LibB
两次传递给链接器来解决这些依赖关系。ilinkarm.exe --silent CMakeFiles\Example.dir\main.c.o LibA.lib LibB.lib LibA.lib LibB.lib -o Example.exe
然而,我使用的IAR链接器已经通过库列表进行了多次遍历,如果只列出LibA
和LibB
一次,则足以满足要求。尽管带有重复项的链接仍然可以工作,但我会收到以下警告:
[build] Warning[Li065]: duplicate file: "LibA.lib"
[build] Warning[Li065]: duplicate file: "LibB.lib"
有没有可能告诉 CMake ,即使存在循环依赖关系,链接器命令中的每个库都必须是唯一的?
我尝试设置 CMAKE_C_LINK_EXECUTABLE
,但是我找不到替代 <LINK_LIBRARIES>
的方法,因为它似乎已经包含重复。这就是为什么此行会导致相同的警告:
set(CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <OBJECTS> <LINK_FLAGS> <LINK_LIBRARIES> -o <TARGET>")
CMake 版本:3.26.3
Ninja 版本:1.10.2
IAR 版本:9.32.2
target_link_libraries(LibA PRIVATE LibB)
和target_link_libraries(LibB PRIVATE LibA)
,会产生什么结果? 依我的经验,ilinkarm 不用于“将库相互链接”。 - sharpgeekLibA
和LibB
的target_include_directories
。如果删除target_link_libraries
,CMake无法解析两个库之间的包含关系,从而导致构建失败。ilinkarm
仅在最后一步用于链接可执行文件,在此时,CMake会添加重复项。 - JiaemTheCode