我有一个包含接口库的图层项目:
add_library(I INTERFACE)
然后多次实现这些接口库,以适应不同的应用程序环境:
add_library(IA STATIC ...)
target_link_libraries(IA PUBLIC I)
add_library(IB STATIC ...)
target_link_libraries(IB PUBLIC I)
还有一些独立于应用程序的库,它们使用了接口库。
add_library(Foo STATIC ...)
target_link_libraries(Foo PUBLIC I)
add_library(Bar STATIC ...)
target_link_libraries(Bar PUBLIC I)
最后,应用程序定义了正在使用的接口库层的实现。
add_executable(ExeA ...)
target_link_libraries(ExeA Foo Bar IA)
add_executable(ExeB ...)
target_link_libraries(ExeB Foo Bar IB)
幸运的是,只要在IA
和Foo
之后的Bar
列出了IA Foo Bar
,就可以了。
但是,我的某些实现再次使用了独立于应用程序的库。 在这些环境中,链接命令行变为如下所示:
Foo Bar IA Foo Bar
虽然应该
Foo
这是有道理的,因为在编译Bar
时没有描述IA
/ ExeA
依赖于target_link_libraries
的明确依赖。
在简单的情况下,我们很幸运,因为它恰好是默认链接命令行与LINK_INTERFACE_MULTIPLICITY
调用中的顺序相同。
我正在使用 gcc-arm-none-eabi 交叉编译器。这是我尝试过的:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--start-group")
似乎不起作用。即使数字越大,生成的命令行仍然相同。
Foo
链接成功,但程序无法在目标硬件上正常运行。只有在连接调试器并重置后,它才会运行。奇怪的行为。
当我将Bar
/ IA
明确地与--start-group
而不是Foo Bar IA Foo Bar
相关联时,命令行变为ExeB
,然后一切正常。但由于{{1}}。