Chciałbym udoskonalić inne rozwiązania, udostępniając mój plik CMakeLists.txt
, który działa również pod względem zależności między budynkami.
Rozwiązanie nadużywania 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}
)
pamiętać, że to rozwiązanie działa tak daleko z Visual Studio, ale myślę, że może to być zgodny wieloplatformowy.Mogę sobie wyobrazić, że po wersji może pracować na platformach Unix:
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..."
)
Zauważ, że te rozwiązania jakoś Nadużywanie CMake gdyż narzekają cel typu gospodarczy (zamiast statycznych lub dzielone) Jeśli umieścisz target_link_libraries
połączenie po zgłoszeniu add_custom_target
.
CUpewnij target-deklaracja zgodny rozwiązanie
Żeby było zgodne CUpewnij można zastąpić `połączenia target_link_libraries' przez
target_link_libraries(mainexec ${LIBNAME})
add_dependencies(mainexec combinedLib)
w moim przypadku to nie jest w pełni zadowalające, ponieważ mainexec
ma aby wiedzieć o combinedLib
, chociaż oczekuje, że wszystkie zależności będą obsługiwane przez wywołanie target_link_libraries
.
Alternatywne rozwiązanie z mniejszym sprzęgłem
Patrząc nieco dalej w kierunku importowanych celów I w końcu znalazłem rozwiązanie, które rozwiązuje mój ostatni problem:
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)
Jeśli zamierzasz zmodularyzowanie cały dodać GLOBAL
po STATIC IMPORTED
, aby importowany cel był widoczny na całym świecie.
przenośne rozwiązanie CUpewnij
Przy obecnych wersjach CUpewnij CUpewnij zapewnia pełne wsparcie dla bibliotek zależności przechodnich i interfejsów. Biblioteka interfejsów może następnie "połączyć" się z innymi bibliotekami, a ta biblioteka interfejsów może być z kolei "połączona". Dlaczego znaki cudzysłowu? Chociaż działa to dobrze, to faktycznie nie tworzy fizycznej, połączonej biblioteki, ale raczej tworzy rodzaj aliasu do zestawu "pod-bibliotek". Nadal było to rozwiązanie, które w końcu potrzebowaliśmy, dlatego chciałem dodać to tutaj.
add_library(combinedLib INTERFACE)
target_link_libraries(combinedLib INTERFACE lib1 lib2)
target_link_libraries(mainexec combinedLib)
To wszystko!
Czy masz statyczne wersje bibliotek, z którymi chcesz się połączyć? A może masz tylko wspólne wersje? – tpg2114
Mam wersje statyczne – Rolle
Więc kiedy mówisz, że nie uwzględnia ich w statycznym, czy próbuje połączyć swoją bibliotekę statyczną z innymi bibliotekami współdzielonymi? – tpg2114