2011-12-12 11 views
12

Mamy projekt P (C/C++ na Linux) składający się z bibliotek lib1, lib2, lib3.Wiele bibliotek CMakeLists.txt

  • lib1 jest samodzielnym połączone z innym bibliotekami systemowymi szeroki
  • lib2 linki do lib1
  • lib3 łączy zarówno lib1 i lib2

mamy katalogów P i dodatkowe katalogi dla każdego nasze biblioteki (tak, P/lib1/, P/lib2/ ...). Każda biblioteka ma również własne testy.

Pytania:

  • proszę, jak zorganizować CMakeLists.txt dla tego scenariusza?
  • Czy powinniśmy utworzyć tylko jeden katalog główny build lub jeden dla każdej biblioteki?
  • Czy możemy mieć opcję w CMakeLists.txt dla łączenia STATIC vs. SHARED?

Odpowiedz

22

W tym przypadku polecam używanie pojedynczego katalogu build /. CMake prawdopodobnie wygeneruje osobne katalogi lib1, lib2 i lib3.

Przełączanie pomiędzy STATIC vs Shared można zrobić za pomocą flagi BUILD_SHARED_LIBS (sprawdź dokumentację add_library)

W odniesieniu do organizacji CMakeLists.txt, wybór należy do Ciebie:

  1. Ty może zbudować pojedynczy plik CMakeLists.txt zawierający wiele pozycji add_library. Ma to tę zaletę, że otrzymasz pojedynczy CMakeLists.txt, który niektórzy ludzie mogą preferować, gdy projekty są proste.

  2. Można podzielić projekt na kilka CMakeLists.txt rozmieszczonych nad LIB1, LIB2 i lib3 katalogów i użyć CMakeLists.txt korzeniowy z add_subdirectory. Zaletą tej konfiguracji jest to, że łatwiej będzie wygenerować pliki kompilacji za pomocą jednego połączenia (w katalogu build /), ale można wtedy łatwo wkroczyć do np. lib3/i wywołaj make/msbuild. CUpewnij zagwarantuje, że zależności są zbudowane prawidłowo

Przykład 1:

project(P) 
# Setup lib1 
set (LIB1_SOURCES ...) # Fill in your set of source-files here... 
add_library(lib1 ${LIB1_SOURCES}) 
# Do similar for lib2 and lib3 
target_link_libraries(lib2 lib1) # Indicate that lib1 is needed for lib2 
target_link_libraries(lib3 lib1 lib2) # Indicate that lib2 and lib1 are needed for lib3 

Przykład 2:

project(P) 
add_subdirectory(lib1) 
add_subdirectory(lib2) 
add_subdirectory(lib3) 

W każdym podkatalogu następnie napisać swój CMakeLists.txt. Na przykład. w przypadku lib3:

project(lib3) 
set(LIB3_SOURCES ...) # Setup the list of sources here. 
add_library(lib3 ${LIB3_SOURCES}) 
# You can refer to other libraries which should be available from the root cmakelists. 
target_link_libraries(lib3 lib1 lib2) 
+0

Świetnie, dziękuję. – Cartesius00

Powiązane problemy