【问题标题】:How to bundle multiple static libraries into single library in CMake for windows如何在 CMake for windows 中将多个静态库捆绑到单个库中
【发布时间】:2020-02-12 14:15:56
【问题描述】:

我想在 CMake 中将五个静态库捆绑到一个库中。我该如何处理?

像库 a、b、c、d 和 e 应该捆绑到 alpha_lib

【问题讨论】:

标签: windows cmake static-libraries


【解决方案1】:

如果您使用的是 Visual Studio,则可以利用 Microsoft Library Manager (LIB.exe) 将您的静态库合并 为一个。您的 CMake 可以按照以下步骤操作:

  1. 使用 find_program() 让 CMake 在您的系统上找到 MSVC lib.exe 工具。如果您从 Visual Studio 命令提示符运行 cmakefind_program 可以自动定位 lib.exe,而无需使用可选的 PATHS 参数告诉它在哪里查找。

  2. 使用 CMake 的add_custom_target() 命令调用lib.exe,使用合并 库的语法:

    lib.exe /OUT:alpha_lib.lib  a.lib b.lib c.lib d.lib e.lib
    

    您可以在自定义目标命令中使用依赖于目标的generator expressions 来让 CMake 解析您构建的库的位置。自定义目标将在您的 Visual Studio 解决方案中创建一个项目,该项目可以单独运行以将所有构建的静态库合并到一个库中。

您的 CMake 可能如下所示:

# Create the static libraries (a, b, c, d, and e)
add_library(a STATIC ${a_SOURCES})
...
add_library(e STATIC ${e_SOURCES})

# Tell CMake to locate the lib.exe tool.
find_program(MSVC_LIB_TOOL lib.exe)

# If the tool was found, create the custom target.
if(MSVC_LIB_TOOL)
    add_custom_target(CombineStaticLibraries
        COMMAND ${MSVC_LIB_TOOL} /OUT:$<TARGET_FILE_DIR:a>/alpha_lib.lib
            $<TARGET_FILE:a> 
            $<TARGET_FILE:b> 
            $<TARGET_FILE:c> 
            $<TARGET_FILE:d> 
            $<TARGET_FILE:e> 
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    )
endif()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多