我有一个带有静态库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是一个对象库->没有帮助,因为情况基本上没有变化。
其他问题:
--start-group/--end-group
这样的仅限gcc的解决方案,因为我们同时针对Visual Studio和gcc 如何使链接程序以组/的形式链接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库当然包含所生成的零件使用的代码(我想是基类等)。