2016-10-21 2 views
1

Я пытаюсь сделать так, чтобы другие проекты связывались с разделяемыми библиотеками, которые мы распространяем с нашим проектом. Когда я пытаюсь использовать механизм EXPORT, CMake жалуется, что я не включаю статические библиотеки, используемые для создания разделяемых библиотек в наборе экспорта. Мне это кажется ненужным, так как другим проектам нужно только связать с общей библиотекой, и я действительно не хочу устанавливать статические библиотеки. Кажется, это очень похоже на this bug, но я могу просто не понимать, как все это работает. Вот минимальный пример:Почему CMake EXPORT требует статических библиотек, используемых для создания общей библиотеки?

CMAKE_MINIMUM_REQUIRED(VERSION 3.2.1) 
PROJECT(ExportTest) 

ADD_LIBRARY(myStaticLib STATIC staticLib.c) 
ADD_LIBRARY(mySharedLib SHARED sharedLib.c) 
TARGET_LINK_LIBRARIES(mySharedLib myStaticLib) 

INSTALL(TARGETS mySharedLib EXPORT myExport DESTINATION lib) 
INSTALL(EXPORT myExport DESTINATION include) 

Что приводит следующее сообщение об ошибке:

CMake Error: install(EXPORT "myExport" ...) includes target "mySharedLib" 
which requires target "myStaticLib" that is not in the export set. 

ответ

1

При использовании target_link_libraries, как вы делали, зависимости библиотек являются переходными по умолчанию. Попытка:

target_link_libraries(mySharedLib PRIVATE myStaticLib) 
+0

Спасибо, что устраняет ошибку. Не могли бы вы помочь мне понять, почему вы хотите, чтобы статическая библиотека считалась зависимой от общей библиотеки? Это похоже на странное поведение по умолчанию. – rpmcnally

+0

'target_link_libraries' не только управляет зависимостями для связи, но и для включения. Учитывая, что ссылка на статическую библиотеку означает, что разделяемая библиотека не будет включать заголовки статического в своем открытом интерфейсе, это очень сильный априори. Разработчики cmake предпочли быть агностиком в этой точке, предоставляя явную подпись для контроля зависимости – wasthishelpful