ホームページ >バックエンド開発 >C++ >CMake を使用して複数の静的ライブラリを 1 つのライブラリにマージするにはどうすればよいですか?

CMake を使用して複数の静的ライブラリを 1 つのライブラリにマージするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-02 11:45:15120ブラウズ

How Can I Merge Multiple Static Libraries into a Single Library Using CMake?

CMake を使用して複数の静的ライブラリを 1 つのライブラリに結合する

プロジェクトが複数の静的ライブラリに依存している場合、プロジェクトの依存関係を維持することが困難になることがあります。プロセスを合理化するには、これらのライブラリを 1 つのユニットにマージすることが望まれます。 CMake にはライブラリをリンクする機能が備わっていますが、静的ライブラリを直接結合する機能がありません。

この問題に対処するには、カスタム ターゲットを使用して目的の結果を達成できます。 ar や libtool などのコマンドを利用すると、静的ライブラリから個々のオブジェクト ファイルを抽出し、新しいアーカイブにマージできます。たとえば、次のコード スニペットを考えてみましょう。

cmake_minimum_required(VERSION 2.8.7)

add_library(b b.cpp b.h)
add_library(a a.cpp a.h)
add_executable(main main.cpp)

set(C_LIB ${CMAKE_BINARY_DIR}/libcombi.a)

add_custom_target(combined
        COMMAND ar -x $<TARGET_FILE:a>
        COMMAND ar -x $<TARGET_FILE:b>
        COMMAND ar -qcs ${C_LIB} *.o
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

add_library(c STATIC IMPORTED GLOBAL)
add_dependencies(c combined)

set_target_properties(c
        PROPERTIES
        IMPORTED_LOCATION ${C_LIB}
        )

target_link_libraries(main c)

この例では、結合されたカスタム ターゲットは、a ライブラリと b ライブラリからオブジェクト ファイルを抽出するために必要なコマンドを実行し、それらを という新しいアーカイブにマージします。 libcombi.a.この結合されたライブラリは、c ターゲットを使用してメインの実行可能ファイルにインポートできます。

または、Apple の開発ツールの libtool コマンドをこの目的に使用できます。

add_custom_target(combined
        COMMAND libtool -static -o ${C_LIB} $<TARGET_FILE:a> $<TARGET_FILE:b>
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
        DEPENDS a b
        )

このアプローチでは、次のような機能が提供されます。堅牢なソリューションとしては、静的ライブラリを直接組み合わせるために CMake 内でよりネイティブな実装を行うことが有益です。これにより、プロセスがさらに合理化され、カスタム ターゲットの必要性がなくなります。

以上がCMake を使用して複数の静的ライブラリを 1 つのライブラリにマージするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。