2011-11-29 10 views
29

Próbuję utworzyć projekt testowy patrząc jak mój własny projekt po prostu dostać rzeczy działa pierwszy i wygląda to tak:CUpewnij z zawierać i ścieżki źródłowe - Podstawowa konfiguracja

/MainProject/inc/main.h 
/MainProject/src/main.cpp 
/LibProject/inc/test.h 
/LibProject/src/test.cpp 

Znalazłem niektóre samouczki, ale nie mogę dowiedzieć się, jak to skonfigurować, gdy mam folder inc i src? Jak wyglądałyby pliki CMakeLists.txt? Czy mam jeden w /, jeden w każdym folderze projektu? Wygląda na to, że nie muszę mieć tego w folderach inc i src?

Odpowiedz

59

Potrzebujesz CMakeLists.txt dla każdego podkatalogu źródłowego. Twoja struktura powinna wyglądać mniej więcej tak:

root 
|-MainProject 
| |-inc 
| | '-main.h 
| |-src 
| | |-main.cpp 
| | '-CMakeLists.txt 
| '-CMakeLists.txt 
|-LibProject 
| |-inc 
| | '-test.h 
| |-src 
| | |-test.cpp 
| | '-CMakeLists.txt 
| '-CMakeLists.txt 
'-CMakeLists.txt 

zawartości root/CMakeLists.txt:

project(MyProject) 
subdirs(MainProject LibProject) 

zawartości LibProject/CMakeLists.txt i MainProject/CMakeLists.txt:

subdirs(src) 

zawartości LibProject/src/CMakeLists.txt:

# Notice name prefix of this variable, set by CMake according 
# to value given with "project()" in the root CMakeLists.txt. 
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc) 
add_library(LibProject test.cpp) 

Zawartość MainProject/src/CMakeLists.txt:

include_directories(${MyProject_SOURCE_DIR}/MainProject/inc) 
# I assume you want to use LibProject as a library in MainProject. 
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc) 
link_directories(${MyProject_SOURCE_DIR}/LibProject/src) 
add_executable(MainProject main.cpp) 
target_link_libraries(MainProject LibProject) 

Następnie należy skonfigurować i zbudować z:

$ cd root 
$ mkdir build 
$ cd build 
$ cmake .. 
$ make 
+8

Nie chodziło o skopiowanie odpowiedzi, ale raczej o jej uzupełnienie. O ile mi wiadomo, nie działałoby bez dwóch brakujących 'CMakeLists.txt' i brakujących' link_directories() 'polecenia. Pierwotnie zamierzałem skomentować twoją odpowiedź, ale moja reputacja jest zbyt niska, by to zrobić. Postanowiłem więc, że druga odpowiedź będzie najbardziej samodzielna. Nie chciał cię urazić. –

+0

Musi działać bez katalogu_linków, ponieważ jest to biblioteka zbudowana przez ten sam projekt. Jeśli chodzi o problem z trasą, masz rację, poprawię to. – Beginner

+0

Aah cool ok .. thanks – bitgregor

18

Można to zrobić tak, jak po.

  • CMakeLists.txt w katalogu MainProject:

    project(MainProject) 
    
    add_subdirectory(LibProject/src) 
    add_subdirectory(MainProject/src) 
    
  • CMakeLists.txt w LibProject/katalogu src:

    include_directories(${PROJECT_SRC_DIR}/LibProject/inc/) 
    add_library(LibProject test.cpp) 
    
  • CMakeLists.txt w MainProject katalogu/src :

    include_directories(${PROJECT_SRC_DIR}/MainProject/inc/) 
    add_executable(MainProject main.cpp) 
    target_link_libraries(MainProject LibProject) 
    
+3

Mogę zapytać dlaczego masz '$ {PROJECT_SRC_DIR}'? Dostałem błąd CMake i musiałem poprawić zmienną w następujący sposób: '$ {PROJECT_SOURCE_DIR}', aby działało – nakajuice

+1

zgodnie z dokumentacją, powinno to być PROJECT_SOURCE_DIR. Szczegółowe informacje można znaleźć tutaj: https://cmake.org/Wiki/CMake_Useful_Variables – wasabi