使用多个接口库实现时的CMake链接排序

时间:2016-07-05 13:45:04

标签: gcc cmake dependencies static-libraries newlib

我有一个包含接口库的图层项目:

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)

幸运的是,只要在IAFoo之后的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}}。

  • ,我一般不能这样做
  • 有没有办法在编译ExeA时如何定义Foo / Bar暂时依赖IA,在编译ExeB时暂时依赖IB?
  • 对于如何处理如上所述的项目结构有不同的方法吗?

0 个答案:

没有答案