C++ CMake外部和内部静态库的循环依赖性

C++ CMake外部和内部静态库的循环依赖性,c++,cmake,linker,C++,Cmake,Linker,我有一个带有静态库libA.a的框架/代码生成器,其中包含由生成的代码(libB)定义的符号。因此,本质上,我认为依赖关系图是循环的,因为生成的代码使用来自libA的API: libB -> libA -> libB 我正在构建libB,然后使用它创建一个可执行文件 set(LIBA libA.a) add_library(libB "${libb_sources}") target_link_libraries(libB libA) add_executable(exec

我有一个带有静态库libA.a的框架/代码生成器,其中包含由生成的代码(libB)定义的符号。因此,本质上,我认为依赖关系图是循环的,因为生成的代码使用来自libA的API:

libB -> libA -> libB
我正在构建libB,然后使用它创建一个可执行文件

set(LIBA libA.a)

add_library(libB "${libb_sources}")

target_link_libraries(libB libA) 

add_executable(execAB ${MAIN_SRC})
target_link_libraries(execAB libB)

我遇到的问题是,在链接过程中,libB中定义的libA符号没有得到解决。相对正常的循环依赖关系,但包括构建期间未构建的外部库

/usr/local/lib/libara_vsomeipbinding.a(vsomeip_proxy_factory.cc.o): In function `ara::com::internal::vsomeip::runtime::VSomeIPProxyFactoryImpl::AvailabilityHandler(unsigned short, unsigned short, bool)':
vsomeip_proxy_factory.cc:(.text+0x7ff): undefined reference to `ara::com::internal::vsomeip::runtime::VSomeIPServiceMapping::GetMappingForVSomeIPServiceId(unsigned short)'
到目前为止,我所尝试的:

  • 使libB成为一个对象库解决了这个问题,但是我需要使它成为一个静态库,以便与项目的其他部分保持一致,所以这不是一个解决方案

  • 定义一个中间静态库libC,libB是一个对象库->没有帮助,因为我想情况基本上没有改变

  • 拥有一个中间库libC,并多次定义依赖项以使它们在链接器命令行中多次出现。没用,他们只出现过一次
  • 定义libB和libC之间的循环依赖关系,希望依赖关系也能加倍。不,只有这两个选项在命令行中出现两次
其他问题:

  • --start group/--end group
    这样的仅用于gcc的解决方案也不是一个选项,因为我们的目标是Visual Studio和gcc
  • 如果可能的话,我不想将libA添加为execAB的依赖项,该依赖项应该封装在某个库目标中(如果可能的话是静态的)
如何让链接器将libA和libB链接为组/两次,以便正确解析所有符号?


更详细的资料:

我正在自适应AUTOSAR的ARA参考实现之上构建一个框架。在AUTOSAR中,服务/服务接口是在XML文件中定义的,ARA有一个代码生成器,它读取这些服务/为它们的通信生成代码,我的框架使用这些代码生成器。在我的cmake构建过程中,ARAgen生成器运行以生成代码

当然,ARA API有一个静态部分,这就是libA。在代码的生成部分(libB的一部分),例如,
ara::com::internal::vsomeip::runtime::VSomeIPServiceMapping::GetMappingForVSomeIPServiceId(unsigned short)
,它根据我要说的名称将数字id映射到特定(生成的)服务。静态ARA部件使用它将服务id映射到服务对象/类


另一方面,静态ARA库当然包含生成的部件使用的代码(我想是基类之类的)

允许静态库之间存在循环依赖关系。CMake应该自动链接静态库两次,以解析所有符号。如果libA是外部的,请通过
add_库(libA导入的静态…)
添加它。您能提供收到的具体错误吗?“没有得到解决”。。。非常模糊。@squareskittles Done-这是一个关于未定义引用的链接时间错误。@KamilCuk我刚才试过-听起来它可能会工作,但不会,因为当我使用
targetr\u link\u库(libA libB)
定义循环依赖项时,cmake抱怨libA作为外部目标,在
接口\u INCLUDE\u目录中有一个不存在的路径
-该路径仅在构建(依赖项的)libB期间生成。这似乎是一个奇怪的限制,但还好。
libB
是作为静态库还是共享库构建的?您的CMake没有指示
静态
共享
,这意味着它将默认为
构建共享库
设置为的任何内容。如果在某处设置此值,则不显示此值。