windows 如何在 CMake 中将多个静态库捆绑到单个库中
How to bundle multiple static libraries into single library in CMake for windows
我想在 CMake 中将五个静态库捆绑到一个库中。我该如何进行?
像库 a、b、c、d 和 e 应该捆绑到 alpha_lib
。
如果您正在使用 Visual Studio,您可以利用 Microsoft Library Manager (LIB.exe) 将您的静态库 合并 为一个.您的 CMake 可以按照以下步骤操作:
使用 find_program()
让 CMake 在您的系统上找到 MSVC lib.exe
工具。如果您从 Visual Studio 命令提示符 运行 cmake
,find_program
可以自动定位 lib.exe
,而无需使用可选的 PATHS
参数来告诉它在哪里看看。
使用 CMake 的 add_custom_target()
命令调用 lib.exe
使用 merging 库的语法:
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()
我想在 CMake 中将五个静态库捆绑到一个库中。我该如何进行?
像库 a、b、c、d 和 e 应该捆绑到 alpha_lib
。
如果您正在使用 Visual Studio,您可以利用 Microsoft Library Manager (LIB.exe) 将您的静态库 合并 为一个.您的 CMake 可以按照以下步骤操作:
使用
find_program()
让 CMake 在您的系统上找到 MSVClib.exe
工具。如果您从 Visual Studio 命令提示符 运行cmake
,find_program
可以自动定位lib.exe
,而无需使用可选的PATHS
参数来告诉它在哪里看看。使用 CMake 的
add_custom_target()
命令调用lib.exe
使用 merging 库的语法: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()