Это в точности эквивалентно. Оба говорят, что A зависит от B, а A зависит от C. Никто ничего не говорит о какой-либо зависимости между B и C, поэтому их нет.
Я не уверен, что вы подразумеваете под "взаимозависимостью" - при рассмотрении B и C существует 4 варианта: (1) ни один не зависит от другого, (2) B зависит от C, (3) C зависит от B, или (4) они оба зависят друг от друга.
(1) - это то, что у вас есть. (2) и (3) означают, что вы должны добавить еще одну команду target_link_libraries с либо «B C» в качестве аргументов, либо «C B» соответственно. (4) означает, что у вас круговая зависимость, и на самом деле они вообще не должны быть отдельными библиотеками, а должны объединяться в одну логическую сущность. Вы должны избегать (4), потому что это делает невозможным загрузку в качестве разделяемых библиотек на некоторых (всех?) Платформах.
Существует незначительное снижение производительности за наличие двух отдельных вызовов target_link_libraries. Я сомневаюсь, что вы могли измерить производительность и показать какие-либо существенные временные различия.
Чтобы уточнить, этот звонок:
target_link_libraries(A B C)
означает, что для цели A требуются библиотеки B и C.
Если вместо этого вы рассмотрите случай (2) выше, где B зависит от C, вы вместо этого напишите:
target_link_libraries(B C)
target_link_libraries(A B)
, что означает, что для цели B требуется библиотека C, а для цели A требуется библиотека B (а CMake автоматически передает зависимости B в A, так что вам не нужно знать о зависимости A -> C, если у вас нет явного кода, который вызывает функциональность в библиотеке С).
Вы должны всегда указывать минимальную информацию о зависимости, необходимую для связывания вещей.