CMake: Разделение (независимых) библиотек на разные вызовы target_link_libraries? - PullRequest
4 голосов
/ 31 августа 2011

Скажем, у меня есть цель A, которая зависит от библиотек B и C.Но B и C не имеют взаимной зависимости.Связь с CMake может выглядеть как

target_link_libraries( A B C )

, но

target_link_libraries( A B )
target_link_libraries( A C )

также, кажется, работает (и может быть более простым в обслуживании).Есть ли недостатки разделения команды target_link_libraries на несколько команд?Или нужно всегда помещать ее в одну команду на случай, если в конце концов возникнет взаимозависимость библиотек?

Ответы [ 2 ]

7 голосов
/ 01 сентября 2011

Это в точности эквивалентно. Оба говорят, что 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, если у вас нет явного кода, который вызывает функциональность в библиотеке С).

Вы должны всегда указывать минимальную информацию о зависимости, необходимую для связывания вещей.

3 голосов
/ 01 сентября 2011

Оба способа действительны и эквивалентны.По сути, команда target_link_libraries просто добавляет указанные библиотеки к свойству LINK_INTERFACE_LIBRARIES переданной цели (A в вашем примере).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...