Как создать библиотеку-оболочку, не раскрывая используемую библиотеку? - PullRequest
2 голосов
/ 23 октября 2019

Используя Cmake, я хотел бы знать, как создать библиотеку-оболочку и позволить пользователям связывать свое приложение только с этой библиотекой. Пользователям не нужно указывать исходную библиотеку в своих флагах компоновщика.

Например, я создаю библиотеку-оболочку для libwebsockets с именем libcustomws.

add_library(customws main.c)
target_link_libraries(customws websockets)

Мне нужен пользователь (сlibwebsockets не установлен), чтобы иметь возможность:

add_executable(user_app user_app.c)
target_link_libraries(user_app customws pthread)

1 Ответ

1 голос
/ 23 октября 2019

Библиотеки оболочек без какого-либо дополнительного кода из вашего проекта лучше всего могут быть реализованы с небольшими целевыми библиотеками INTERFACE с тегом IMPORTED. Пример для вашего сценария:

add_library(customws INTERFACE IMPORTED)

target_include_directories(customws
    INTERFACE
    /some/include/path)

target_link_libraries(customws
    INTERFACE
    websockets)

Таким образом, цели, которые используют эту библиотеку, могут просто

add_executable(user_app user_app.c)
target_link_libraries(user_app customws pthread)

и получить требования к использованию от цели customws, в данном случае включитькаталог и связанная библиотека (websockets) распространяются до customws. Это может быть хорошо, так как может инкапсулировать детали реализации зависимости (различные флаги для разных платформ и т. Д.).

Если вы хотите автоматически ссылаться на скомпилированный код (который является частью вашего проекта),это можно легко сделать, добавив небольшую промежуточную библиотеку OBJECT, например,

add_libraray(customwsenhanced
    OBJECT
    someCode.c)

target_link_library(customwsenhanced
    PUBLIC
    customws)

В зависимости от того, зависит ли someCode.c от требований использования customws, target_link_library для customwsenhanced можеттакже используйте INTERFACE распространение. Теперь клиентское приложение может идти с

add_executable(user_app user_app.c)
target_link_libraries(user_app customwsenhanced pthread)

и получит как скомпилированный объектный код someCode.c, так и флаги и т. Д. От customws.

...