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

时间:2019-11-22 15:20:05

标签: 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(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设置为OBJECT库可以解决此问题,但我需要将其设置为静态库,以与项目的其他部分保持一致,所以这不是解决方案

  • 定义一个中间静态库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库当然包含所生成的零件使用的代码(我想是基类等)。

0 个答案:

没有答案