1

我有一个项目,我在静态库和共享库之间混合。共享库已交付。每个共享库都是用其对应的静态库构建的。共享库也可以依赖于其他共享库。例如,我有:sharedAsharedBsharedCstaticA和。内置于内部,与其他共享类似。比方说,除了依赖于,还依赖于。staticBstaticCSharedAstaticAsharedCstaticCsharedB

对于静态库,如果他们需要依赖另一个静态库,我会链接到一个对应的共享库。例如:

staticB取决于staticA。因此,我链接staticBsharedA. 这样做的原因是如果静态声明 staticB 对staticA.

这个系统一直在工作。但是,当我构建具有隐藏可见性的静态库时,就会出现问题。链接器链接没有错误。但是一个特定类的多个符号可能最终会出现在最终的符号映射中。因此,程序可以选择不需要的,这会导致奇怪的行为。

我一直在阅读有关 cmake 对象库的信息,在这种情况下,将静态库切换到对象库可能会有所帮助。我将静态库更改为对象,并得到未定义的符号错误。我定义了一个对象库对其他库的依赖,但仍然无法摆脱所有错误。我的问题是:

  1. target_link_libraries(obj2 PUBLIC obj)用来声明 2 个对象库之间的依赖关系。这可能是我得到未定义符号错误的原因吗?因为根据 cmake 文档:

对象库可以“链接”到其他对象库以获得使用要求,但由于它们没有链接步骤,因此不会对其对象文件进行任何操作。

  1. 也许我应该切换到target_link_libraries(obj2 $<TARGET_OBJECTS:obj>)这样obj2是用来自的目标文件构建的obj.c?另一件事是:obj需要是一个库(使用创建add_library)。在我定义所有链接的函数中,obj是一个变量,不能放在$<TARGET_OBJECTS:. 我一直在环顾四周,但找不到任何东西。有没有办法可以将变量名放在 之后$<TARGET_OBJECTS:,或者我必须以某种方式折射才能使这成为可能?

  2. 关于如何做到这一点的任何其他建议都会对我有所帮助

4

0 回答 0