【问题标题】:How to create a wrapper library without exposing the underlying library being used?如何在不暴露正在使用的底层库的情况下创建包装库?
【发布时间】:2019-10-22 22:57:55
【问题描述】:

使用 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)

【问题讨论】:

  • "未安装 libwebsockets" - 这是否意味着 user_app 可执行文件将无法编译?

标签: cmake shared-libraries


【解决方案1】:

在您的项目中没有任何额外代码的包装库最好使用带有IMPORTED 标记的小型INTERFACE 库目标来实现。您的场景示例:

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的使用需求,customwsenhancedtarget_link_library也可以使用INTERFACE传播。现在,客户端应用程序可以使用

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

并且将从customws获得someCode.c的编译目标代码以及标志等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2016-02-14
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多