2011-02-11 10 views
9

Powiedzmy mam prosty projekt powitania z układem katalogu pseudo-normaCUpewnij z "standard" układ katalogów (Linux)

helloworld/ 
    src/ 
    main.c 
    say.c 
    say-helper.c 
    include/ 
    say.h 
    say-helper.h 
    build/ 

i po uruchomieniu

cd ~/helloworld/build 
cmake .. 
make 

Spodziewam się następujące

helloworld/ 
    build/lib/ 
    libsay.a 
    libsay.so 
    libsay.so.1.0.0 
    tmp/obj/ 
    main.o 
    say.o 
    build/bin/ 
    hello 

i po make install spodziewałbym

/usr/local/lib/ 
    libsay.a 
    libsay.so 
    libsay.so.1.0.0 
/usr/local/bin/ 
    hello 

Jaka byłaby wersja CMakeLists.txt dla tej konfiguracji?

Szukałem przykładów, ale jedyny, który znalazłem, pokazuje, jak dodać bibliotekę, a plik wykonywalny nie działa. Polecenia

Odpowiedz

8

Podstawowe opisać projekt:

INCLUDE_DIRECTORIES(include) 
ADD_LIBRARY(say src/say.c src/say-helper.c) 

ADD_EXECUTABLE(hello src/main.c) 
TARGET_LINK_LIBRARIES(hello say) 

Ta funkcja służy do umieszczania bibliotekami i wykonywalny w katalogu build, że umieścić w swojej CMakeLists.txt:

SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) 
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) 
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) 

Aby zainstalować cię określić

install(TARGETS say hello 
      RUNTIME DESTINATION bin 
      LIBRARY DESTINATION lib 
      ARCHIVE DESTINATION lib) 

w swoim CMakeLists.txt i ustawić CMAKE_INSTALL_PREFIX do/usr/local w swoim CO nfiguracja.

Nie jestem pewien, czy można budować statyczne i dynamiczne biblioteki jednocześnie o tej samej nazwie. I nie wiem, jak powiedzieć CMake, aby umieścić pliki obj w określonej lokalizacji.