2011-10-19 8 views
9

Próbuję użyć cmake (w Linuksie z GNU make i g ++) do zbudowania projektu z dwoma podkatalogami: MyLib i MyApp. MyLib zawiera źródło statycznej biblioteki; MyApp musi połączyć się z tą biblioteką. Próbuję budować na Linuksie z wygenerowanymi plikami makefile przy użyciu następującego CMakeLists.txt:CMAKE: Buduj bibliotekę i łącz się z nią

cmake_minimum_required (VERSION 2.6) 
project (MyProj) 
include_directories (MyLib) 
file(GLOB MyLibSrc MyLib/*.cpp) 
add_library(MyLibrary STATIC ${MyLibSrc}) 
file(GLOB MyAppSrc MyApp/*.cpp) 
add_executable(MyApplication ${MyAppSrc}) 
target_link_libraries(MyApplication MyLibrary) 

To "prawie" działa. Zawodzi podczas połączenia, ponieważ generuje bibliotekę libMyLibrary.a - znajduje się w katalogu głównym. Gdy dodaję:

link_directories(${MyProj_BINARY_DIR}) 

to nie ma znaczenia.

mam kilka (Inter-linked) pytania:

  1. Jaki jest najlepszy sposób, aby wymusić cmake do budowania moją bibliotekę i wykonywalnego w „katalogu pomostowym” — powiedzieć MyStage — utrzymać cele oddzielenia ze źródła?
  2. Jak przekonać cmake do połączenia aplikacji z biblioteką?
  3. Jeśli chciałem zbudować wersję debugowania i wersję release, jaki jest najlepszy sposób na rozszerzenie moich skryptów cmake, aby to zrobić —, upewniając się, że aplikacja do debugowania łączy się z biblioteką debugowania i aplikacją do wydania w stosunku do biblioteki wersji?

Jestem względną nowicjuszką do cmake. Przeczytałem, co mogę znaleźć w sieci, ale staram się zmusić bibliotekę do połączenia z moim plikiem wykonywalnym. Ten rodzaj konfiguracji, według mnie, powinien być dość powszechny. Przykład, w którym do łóżeczka byłoby bardzo pomocne, ale nie znalazłem.

Odpowiedz

3
  1. Użyj "z wersji źródłowej". Utwórz katalog używany tylko do kompilacji i jednocześnie w niej zadzwonić

    cmake <path to the sources, it may be relative>
  2. Albo użyć

    link_directories(${MyProj_BINARY_DIR}/MyLib)

    lub dokonać CMakeLists.txt w każdym podkatalogu - że byłoby lepiej dla projektu większej niż bardzo małe.

  3. To jest trochę trudne, sprawdź CMAKE_BUILD_TYPE w dokumentach (możesz to ustawić i/lub "jeśli" przez to). Można również ustawić go z linii poleceń:

    cmake -DCMAKE_BUILD_TYPE=Debug
+0

widzę, jak (1) mogłaby działać - choć nie sądzę, że to miłe. Nie chcę CMakeLists.txt w moim katalogu "przemieszczania" obok mojej biblioteki, jeśli mogę pomóc. – aSteve

+0

Uhm, nie, nie, CMakeLists.txt pozostanie w drzewie źródłowym. Ścieżka, która jest przekazywana jako argument do cmake, jest katalogiem zawierającym najwyższy poziom CMakeLists.txt. W tej konfiguracji katalog "inscenizacja" jest całkowicie pusty przed wywołaniem cmake. – kralyk

3

odkryłem 'optymalne' rozwiązanie (1) ... tak, że powinienem to pisać tutaj:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage) 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage) 

To, co wcześniej zdezorientowało mnie, to że statyczne biblioteki nie są uważane za BIBLIOTEKA przez Cmake - są uważane za ARCHIWUM.

+0

Jedyna pomocna odpowiedź, jaką znalazłem! Nazewnictwo jest tak mylące! – rationalcoder

15

Cóż, lepiej przeczytać example i zrobić to, co dokładnie zasugerował.

cmake_minimum_required (VERSION 2.6) 
project (MyProj CXX) 
add_subdirectory(MyLib) 
add_subdirectory(MyApp) 

Następnie dla każdego podanego katalogu, CMakeLists.txt są tworzone

myLib \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_library(MyLib ${SRC_FILES}) 

MojaApl \ CMakeLists.txt

file(GLOB SRC_FILES *.cpp) 
add_executable(MyApp ${SRC_FILES}) 
target_link_libraries(MyApp MyLib)