Как объединить несколько библиотек stati c в одну библиотеку в CMake для windows - PullRequest
1 голос
/ 12 февраля 2020

Я хочу объединить пять стати c библиотек в одну библиотеку в CMake. Как я могу продолжить это?

Как библиотеки a, b, c, d и e должны объединяться в alpha_lib.

1 Ответ

1 голос
/ 12 февраля 2020

Если вы используете Visual Studio, вы можете воспользоваться Microsoft Library Manager (LIB.exe) для объединения ваших стати c библиотек в одну. Ваш CMake может выполнить следующие шаги:

  1. Используйте find_program(), чтобы CMake обнаружил инструмент MSV C lib.exe в вашей системе. Если вы запускаете cmake из командной строки Visual Studio, find_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
    

    Вы можете использовать выражения генератора, зависящие от цели в пользовательской целевой команде, чтобы CMake разрешил расположение ваших встроенных библиотек. Пользовательская цель создаст в вашем решении Visual Studio проект, который можно запустить отдельно, чтобы объединить все встроенные библиотеки stati c в одну библиотеку.

Ваш 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()
...