Архивация статических зависимостей в современном проекте CMake - PullRequest
0 голосов
/ 30 августа 2018

Мне нужно упаковать библиотеку C ++, которая связывается с некоторыми другими статическими библиотеками, и я хотел бы иметь возможность отправлять скомпилированные файлы в одиночку, без необходимости также передавать транзитивные зависимости. С этой целью я следую этому руководству по современным методам CMake , и я указал все необходимые зависимости как PRIVATE, так как они не используются в предоставляемом API моей библиотеки.

Проблема в том, что, несмотря на указание зависимостей как PRIVATE, компоновщик по-прежнему не включает их в выходную библиотеку, поэтому, если я попытаюсь связать свою библиотеку с исполняемым файлом, компоновщик будет жаловаться на недостающие символы (по крайней мере, с использованием MSVC). Есть ли способ решить эту проблему?

Я уже посмотрел на это , но я не уверен, как интегрировать его в существующие цели INSTALL

1 Ответ

0 голосов
/ 31 августа 2018

Предполагается, что вы создаете статическую библиотеку:

Вы получаете неразрешенные символы, поскольку зависимости в статических библиотеках не разрешаются при их создании. Только когда вы связываете статическую библиотеку с исполняемой или разделяемой библиотекой, компоновщик на самом деле пытается разрешить необходимые символы (и в вашем случае произойдет сбой).

Так что вам нужно объединить ваши статические библиотеки в одну (как вы уже узнали).

Вы должны следовать подходу объединения add_custom_command и add_custom_target, который изложен в ответах, с которыми вы связаны (https://stackoverflow.com/a/32888999/1228449).

Затем используйте INSTALL( FILES ....), чтобы добавить объединенную библиотеку к командам установки, например ::

.
include(GNUInstallDirs)
INSTALL( FILES ${LIBNAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} )

EDIT: Или создайте общую библиотеку.

ADD_LIBRARY( mylibrary SHARED ...)

Затем требуемые символы используемых статических библиотек разрешаются во время соединения вашей библиотеки. Кроме того, только символы, которые фактически использует ваша библиотека, интегрированы в вашу библиотеку (тогда как статическая библиотека будет содержать все).

...