Связывание библиотек в C ++, зависимость между тремя библиотеками - PullRequest
3 голосов
/ 18 марта 2020

Это может быть странный вопрос для начинающих. Однако у меня следующая ситуация:

В моем коде я создаю три библиотеки, скажем, A , B и C , В библиотеке B я связываю библиотеку A, так что-то вроде target_link_libraries(... A).

Моя C библиотека связывается с B. Итак, у меня есть: B -> A C -> B.

Если тогда возможно, что я использую методы, перечисляет все, что определено в библиотеке A также в C? Хотя C явно не связывает А? Я использовал enum, определенный в библиотеке A в C, A::someClass::someEnum, и он скомпилировал и показал правильные записи значений.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Если это возможно, я использую методы, перечисляет все, что определено в библиотеке А, также в C?

Использует ли ваша библиотека C эти методы / enums / и др c. через , включая заголовок из библиотеки A или из библиотеки B?

Если C напрямую включает заголовок из библиотеки A, то он должен быть связан с библиотекой A явно :

# A is a private linkage of B.
target_link_libraries(B PRIVATE A)
# C needs to be linked with A
target_link_libraries(C B A)

Если C включает заголовок из библиотеки B, который, в свою очередь, включает заголовок из библиотеки A, то библиотека должна быть часть интерфейса B :

# B links with A and this linkage is an interface of B
target_link_libraries(B PUBLIC A)
# C may link with B only
target_link_libraries(C B)

Эти подходы предполагают использование "современного" (ориентированного на target ) CMake. Но используя эти подходы, можно получить наиболее масштабируемое решение.

0 голосов
/ 18 марта 2020

Помните, что зависимость компоновки и компиляция не одно и то же.

Вполне возможно, что источники библиотеки C используют определения из заголовков, связанных с библиотекой A ... независимо от того, C при соединении зависит от А.

Теперь в CMake мы используем target_link_libraries() не только для связи. Эта команда CMake гарантирует, что заголовки библиотеки доступны для зависимой цели для компиляции, и что ее библиотеки доступны для связывания.

Для библиотеки C также может потребоваться библиотека A для связывание - чтобы иметь определения, скажем, функций или переменных из библиотеки А. Теоретически библиотеки могут иметь зависимости кольцевой ссылки (что означает, что вам нужно либо связать весь круг, либо не включать его).

...