Есть сервисы, которые с ними линкуются. Чтобы библиотеки собирались им нужны инклуды других библиотек. Я решил сделать это через INTERFACE инклуды и линк библиотеки с библиотекой через PRIVATE:
lib1:
target_include_directories(lib1, INTERFACE includes)
lib2:
target_link_libraries(lib2 PRIVATE lib1)
service1
target_link_libraries(service1 lib1 lib2)
Но в выводе линкера, вместо -llib1 -llib2 я вижу -llib1 -llib2 -llib1. Я неправильно понимаю смысл PRIVATE cкоупа в линкере?
Libraries and targets following PRIVATE are linked to, but are not made part of the link interface.
...
When the target is linked into another target using the target_link_libraries() command, the libraries listed (and recursively their link interface libraries) will be provided to the other target also
```
там есть какие-то свои нюансы, но если вкратце — при target_link_libraries(executable library) смак почти всегда будет подкидывать в команду линкера для executable всю цепочку зависимостей от library, потому что чёрт его знает где у тебя по дороге libfoo.a может полагаться на символы из libbar.a
я как раз этого и хотел избежать
да, я понял единственное известное мне (костыльное) решение: add_library(INTERFACE mylib_headers) target_include_directories(mylib_headers INTERFACE include/) add_library(STATIC mylib) target_link_libraries(PUBLIC mylib_headers) target_link_libraries(foo PRIVATE mylib_headers) # если нужны только хедеры target_link_libraries(bar PRIVATE mylib) # если нужны хедеры и статиклиба (как альтернатива — поизощряться с $<TARGET_PROPERTY:mylib,INTERFACE_INCLUDE_DIRECTORIES> или как его там)
это всё можно в макрос/функцию оборачивать
можно, только ЕМНИП что один что другой способ не дадут тебе транзитивности инклюдов (а вот это обычно как раз супер-важно), и в итоге ты будешь вручную делать target_include_directories(lib2 lib1_headers lib0_headers lib1_weird_dependency_headers ...) или плодить target_link_libraries(lib1_headers INTERFACE lib0_headers)
что именно не даст? интерфейс либы?
нет волшебной кнопки для "дай мне в правильном порядке все-все-все пути к хедерам которые находятся в дереве зависимостей lib2"; проперть INTERFACE_INCLUDE_DIRECTORIES содержит только то, что было навешено самостоятельно через target_include_directories(lib2 INTERFACE) — но не прилетевшее через target_link_libraries(lib2 lib1)
не понял. С хедерами вообще проблем не должно быть
Обсуждают сегодня