powiedzmy istnieje następująca struktura katalogu:Nakładające zależności między bibliotekami w CMake
projects
|
+--lib1
| |
| +-CMakeFiles.txt
|
+--lib2
| |
| +-CMakeFiles.txt
|
+--test
|
+-CMakeFiles.txt
LIB1/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_library(lib1 STATIC lib1.cpp)
Lib2/CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_library(lib2 STATIC lib2.cpp)
target_link_libraries(lib2 lib1)
Test /CMakeFiles.txt:
cmake_minimum_required(VERSION 2.0)
project(test)
add_subdirectory(../lib1 ${CMAKE_CURRENT_BINARY_DIR}/lib1)
add_subdirectory(../lib2 ${CMAKE_CURRENT_BINARY_DIR}/lib2)
add_executable(test main.cpp)
target_link_libraries(test lib1 lib2)
tj. lib2
zależy od lib1
i test
zależy od nich obu. (Wiem, że technicznie statyczne biblioteki nie "łączą", ale to tylko przykład).
Problem polega na tym, że przy obecnej konfiguracji lib1 kompiluje się dwa razy - pierwszy raz znajduje się w katalogu testowym "test", a drugi raz w "test/katalog_budowy/lib2/katalog_budowy". Chciałbym tego uniknąć.
Chcę móc dodać zależność od biblioteki lib1, lib2 lub obu (przy użyciu add_subdirectory) do dowolnego projektu znajdującego się w innym miejscu. Tak więc przenoszenie CMakeFiles nie jest opcją. Chciałbym także uniknąć kilku kompilacji biblioteki.
Jak mogę to zrobić?
cmake-2.8.4 WinXP SP3
--EDIT-- najwyższego poziomu cmakelists nie jest opcją, ponieważ chcę zachować czyste katalogu najwyższego poziomu i móc zawierać bibliotek w innych projektach który może znajdować się w innym miejscu. Ponieważ jest to system Windows, nie mogę "zainstalować całego systemu" - nie chcę stracić możliwości przełączania kompilatora w locie. Biblioteki narzędziowe zbudowane przy użyciu różnych kompilatorów będą używać różnych bibliotek środowiska wykonawczego C/ABI, w wyniku czego będą niezgodne.
Mogą wystąpić przypadki, w których można jednoznacznie przypisać zależność lib1 do biblioteki lib2 lub odwrotnie. Ale są też typowe przypadki, w których luźno sprzężono moduły, które chcesz zbudować (pomyśl o różnych wtyczkach), które współdzielą zależności. Na przykład masz prog1, który ma zależność lib1 i lib2 i masz prog2, który ma zależność lib2 i lib3. A teraz, jeśli chcesz mieć różne kombinacje (na przykład nie potrzebujesz prog2 w tym przypadku, więc po prostu go nie dołączaj), może to być problem, jeśli lib2 jest zależnością prog2, ponieważ nie jest już dostępna . – user518450
user518450 ma poprawny punkt; w moim przypadku mam sytuację, w której zarówno aplikacja (zwana testem w przykładzie) jak i lib2 zawiera kod używający lib1, ale zależność od lib2 do lib1 jest warunkowa, ponieważ zależy od funkcji włączonych w lib2. Zatem lib2 może lub nie może być zależna od lib1. Nie trzeba dodawać, że chciałbym znaleźć rozwiązanie tego problemu. – psyill
@psyill sprawdź poniżej moją odpowiedź z nagłówkami-strażnikami. działa jak urok w tego rodzaju sytuacjach. – user518450