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。很抱歉造成混淆。