2012-02-19 17 views
11

Mam bardzo prostą strukturę katalogów: plikiCUpewnij wykonywalny lokalizacja

Project 
Project/src 
Project/build 

źródłowe są w Project/src i robię build out-of-src w Project/build. Po uruchomieniu cmake ../ ; make, mogę uruchomić plik wykonywalny w ten sposób: Project/build$ src/Executable - czyli Executable jest tworzony w katalogu build/src.

Jak ustawić lokalizację pliku wykonywalnego w pliku CMakeLists.txt? Próbowałem wykonać niektóre z przykładów znalezionych na cmake.org, ale linki, które działają, wydają się nie pokazywać tego zachowania.

Mój plik Project/src/CMakeLists.txt znajduje się tutaj.


include_directories(${SBSProject_SOURCE_DIR}/src) 
link_directories(${SBSProject_BINARY_DIR}/src) 

set (SBSProject_SOURCES 
    main.cpp 
    ) 

add_executable(TIOBlobs ${SBSProject_SOURCES}) 

I najwyższego poziomu Project/CMakeLists.txt:


cmake_minimum_required (VERSION 2.6) 
project (SBSProject) 

set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 

add_subdirectory(src) 

Odpowiedz

16

Masz kilka opcji do wyboru.

Aby zmienić domyślną lokalizację plików wykonywalnych, ustaw CMAKE_RUNTIME_OUTPUT_DIRECTORY w wybranej lokalizacji. Na przykład, jeśli dodasz

set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

do Project/CMakeLists.txtprzed komendy add_subdirectory, plik wykonywalny skończy się w Project/build dla Unix buduje lub build/<config type> dla Win32 buduje. W celu uzyskania dalszych informacji, uruchom:

cmake --help-property RUNTIME_OUTPUT_DIRECTORY 

Inną opcją dla projektu tej wielkości jest posiadanie tylko jednego CMakeLists.txt. Można mniej lub bardziej zastąpić add_subdirectory(src) zawartością Project/src/CMakeLists.txt, aby uzyskać te same ścieżki wyjściowe.

Istnieje jednak kilka dalszych problemów.

Ogólnie rzecz biorąc, najpewniej należy unikać używania link_directories. Dla wyjaśnienia, uruchom

cmake --help-command link_directories 

Nawet jeśli używamy link_directories, jest mało prawdopodobne, że wszystkie biblioteki będzie można znaleźć w ${SBSProject_BINARY_DIR}/src

Inną kwestią jest, że CMAKE_CXX_FLAGS dotyczą Unix buduje, więc prawdopodobnie powinny być opakowane w blok if (UNIX) ... endif(). Oczywiście, jeśli nie planujesz budować na czymkolwiek innym niż Unix, nie jest to problemem.

Wreszcie, polecam wymagające CMake 2.8 jako minimum, chyba że trzeba użyć 2.6 - CUpewnij jest aktywnie opracowany projekt i obecna wersja ma wiele znaczące ulepszenia ponad 2,6

więc pojedynczy zamiennikiem Project/CMakeLists.txt mógłby wyglądać następująco:

cmake_minimum_required (VERSION 2.8) 
project (SBSProject) 

if (UNIX) 
    set (CMAKE_CXX_FLAGS "-g3 -Wall -O0") 
endif() 

include_directories (${SBSProject_SOURCE_DIR}/src) 

set (SBSProject_SOURCES 
    ${SBSProject_SOURCE_DIR}/src/main.cpp 
    ) 

add_executable (TIOBlobs ${SBSProject_SOURCES}) 
2

Innym sposobem przeprowadzki wykonywalny lokalizację pliku jest poprzez set(EXECUTABLE_OUTPUT_PATH Dir_where_executable_program_is_located)