Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 使用接口库的多个实现时进行链接排序_Gcc_Cmake_Dependencies_Static Libraries_Newlib - Fatal编程技术网

Gcc 使用接口库的多个实现时进行链接排序

Gcc 使用接口库的多个实现时进行链接排序,gcc,cmake,dependencies,static-libraries,newlib,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 ...) targ

我有一个项目,其图层由接口库组成:

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)
幸运的是,只要在合成链接命令中的
Foo
Bar
之后列出
IA
,这就可以了

然而,I的某些实现再次使用了独立于应用程序的库。 在这些环境中,“链接”命令行类似于:

IA Foo Bar
虽然它应该是

Foo Bar IA Foo Bar
这是有意义的,因为在编译
ExeA
时,
Foo
/
Bar
依赖于
IA
,没有明确的依赖关系

在这个简单的例子中,我们很幸运,因为默认情况下,link命令行的顺序与
target\u link\u库
调用中的顺序相同

我正在使用gcc-arm-none-eabi交叉编译器。以下是我尝试过的:

  • LINK\u INTERFACE\u多重性

    似乎不起作用。生成的命令行仍然相同,即使数字更高

  • set(CMAKE_EXE_LINKER_FLAGS“${CMAKE_EXE_LINKER_FLAGS}-Wl,--start group”)

    链接成功,但程序无法在目标硬件上正常运行。只有在连接调试器并重置之后,它才会运行。奇怪的行为

    当我用
    IA
    而不是
    --start group
    显式链接
    Foo
    /
    Bar
    时,命令行变为
    Foo Bar IA Foo Bar
    ,然后一切正常。但是我一般不能这样做,因为
    ExeB


  • 有没有一种方法可以定义Foo/Bar在编译ExeA时暂时依赖于IA,在编译ExeB时暂时依赖于IB?
  • 对于如何处理类似上述结构的项目,是否有不同的方法?

X无法链接到A,链接失败。
-因此X实际上与A链接。为什么不明确地告诉
目标链接库(xa)
?第二个程序链接到yb。B与A有相同的接口,因此如果我让X依赖于A,那么A和B都将被编译。Y(使用X的头)的含义是什么?如果Y实现与X相同的接口,那么它应该是附加的接口库X_I,它由X和Y链接。在这种情况下,您可以分别将X链接到A和B。A、B、C实现I。X使用I,Y使用X,App1使用Y+A。App2使用Y+B。App3使用Y+C。很抱歉造成混淆。
X无法链接到A,链接失败。
-因此X实际上与A链接。为什么不明确地告诉
目标链接库(XA)
?第二个程序链接到YB。B与A具有相同的接口,因此如果我让X依赖于A,A和B都将被编译。
Y(使用X的头)
是什么意思?如果Y实现与X相同的接口,那么它应该是附加的接口库X_I,它由X和Y链接。在这种情况下,您可以分别将X链接到A和Y链接到B。A、B、C实现I。X使用I,Y使用X,App1使用Y+A。App2使用Y+B。App3使用Y+C。很抱歉造成混淆。