私はCMakeLists.txt
ファイルを実際に提供することで、他のソリューションを強化したいと考えています。このソリューションは、Visual Studioで、これまでに動作しますが、私はそれは、マルチプラットフォーム対応のなされることができますねというCMakeの
cmake_minimum_required(VERSION 2.8)
add_library(lib1 test1.cpp)
add_library(lib2 test2.cpp)
include_directories(${CMAKE_CURRENT_DIR})
add_executable(mainexec main.cpp)
target_link_libraries(mainexec combinedLib) # Important to place before add_custom_target
set(LIBNAME "combinedLib.lib")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND lib.exe /OUT:${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
add_custom_target(combinedLib
DEPENDS ${LIBNAME}
)
注意を悪用
ソリューション。私は、次のバージョンでは、UNIXベースのプラットフォームのために働くかもしれないと想像することができます:あなたが置くならば、それは(代わりに静的または共有の)型UTILITYの対象に文句を言うと同じように、これらのソリューションは何とかCMakeのを誤用することを
set(LIBNAME "libCombinedLib.a")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND ar -rcT ${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
注意をtarget_link_libraries
add_custom_target
宣言の後に呼び出します。
CMakeの目標宣言準拠のソリューション
それCMakeの準拠にするには、あなたが私の場合は
target_link_libraries(mainexec ${LIBNAME})
add_dependencies(mainexec combinedLib)
によって `target_link_libraries'コールを置き換えることができmainexec
を持っているので、それは完全に満足できるものではありませんすべての依存関係がtarget_link_libraries
呼び出しによって処理されることを期待していますが、combinedLib
について知る必要があります。あなたは全体の後GLOBAL
を追加モジュール化する場合
cmake_minimum_required(VERSION 2.8)
add_library(lib1 test1.cpp)
add_library(lib2 test2.cpp)
include_directories(${CMAKE_CURRENT_DIR})
add_executable(mainexec main.cpp)
set(LIBNAME "combinedLib.lib")
add_custom_command(
OUTPUT ${LIBNAME}
COMMAND lib.exe /OUT:${LIBNAME} $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>
DEPENDS lib1 lib2
COMMENT "Combining libs..."
)
add_custom_target(combinedLibGenerator
DEPENDS ${LIBNAME}
)
add_library(combinedLib STATIC IMPORTED)
set_property(TARGET combinedLib PROPERTY IMPORTED_LOCATION ${LIBNAME})
add_dependencies(combinedLib combinedLibGenerator)
target_link_libraries(mainexec combinedLib)
:
少ないカップリングと代替ソリューション
輸入目標に向けて、さらにビットを見て、私は最終的に私の最後の問題を解決する解決策を見つけましたSTATIC IMPORTED
を使用すると、インポートされたターゲットをグローバルに表示できます。 CMakeのは推移的依存関係とインタフェースライブラリを完全にサポートを提供し、現在のCMakeのバージョンで
ポータブルCMakeのソリューション
。インタフェースライブラリは他のライブラリと「リンク」することができ、このインタフェースライブラリは「リンク」することができます。なぜ引用符ですか?これはうまくいきますが、実際には物理的に結合されたライブラリを作成するのではなく、一連のサブライブラリのエイリアスを作成します。それでも私たちが最終的に必要としていた解決策だったので、ここに追加したいのです。
add_library(combinedLib INTERFACE)
target_link_libraries(combinedLib INTERFACE lib1 lib2)
target_link_libraries(mainexec combinedLib)
これだけです!
リンクする必要のあるライブラリの静的バージョンはありますか?または、共有バージョンのみを持っていますか? – tpg2114
私は静的なバージョン – Rolle
を持っています。静的に静的なライブラリを含めていないと言うと、他の共有ライブラリとスタティックライブラリをリンクしようとしていますか? – tpg2114