CMake - объединить несколько библиотек в одну - PullRequest
4 голосов
/ 26 мая 2011

Допустим, у меня есть исполняемые файлы A, B, C, и у меня есть внешние библиотеки X, Y, Z

SET(EXTERNAL_LIB X Y Z)
TARGET_LINK_LIBRARIES(A, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(B, ${EXTERNAL_LIB})
TARGET_LINK_LIBRARIES(C, ${EXTERNAL_LIB})

Однако, если я это визуализирую (используя опцию cmake --graphviz, я получаю сложный двудольный граф с ребрами от каждого из исполняемых файлов A, B и C к каждой из библиотек X, Y и Z.

Мне было интересно, есть ли способ объединить все библиотеки в одну.

1 Ответ

4 голосов
/ 26 мая 2011

Все это немного зависит от вашей платформы, компилятора и типа библиотек:

  1. В случае, если вы можете построить X, Y, Z самостоятельно: создайте новый проект XYZ, построенный из агрегированных исходных файлов X, Y и Z. Но я думаю, если бы это было возможно, вы бы не спросили на SO.

  2. Если вы не можете перестроить библиотеки и они были созданы как общая библиотека (dll / so), вам не повезло. Вы можете попытаться написать библиотеку-оболочку, которая скрывает все внутренности X, Y и Z и которая будет использоваться приложениями A, B и C.

  3. Если они были построены как статические библиотеки, взгляните на этот ТАК вопрос . Поскольку статическая библиотека не намного больше, чем архив объектных файлов, вы можете извлечь объектный код из каждой библиотеки и рекомбинировать их с помощью ar.

Но зачем тебе? Предположим, вы получили четвертое приложение D, которое зависит только от X. Тогда вам все равно понадобится отдельная библиотека Y (если вы не предпочитаете без необходимости связываться со всеми библиотеками).

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