2013-07-15 1 views
14

Sono nuovo di CMake e vorrei chiedere se qualcuno può aiutare nel seguente problema.Ricerca CMake ricorsiva per i file di intestazione e origine

Ho i file di origine e di intestazione C++ nelle loro rispettive cartelle e ora, voglio creare un file di testo CMake che li cerchi in modo ricorsivo.

Attualmente, sto facendo in questo modo:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
PROJECT(CarDetectorDAISY) 

file(GLOB_RECURSE SRCS *.cpp) 
file(GLOB_RECURSE HDRS *.h) 

ADD_EXECUTABLE(stereo_framework ${SRCS} ${HDRS}) 
TARGET_LINK_LIBRARIES(stereo_framework) 

Questo crea la mia CarDetectorDAISY.sln lima soluzione e quando provo a costruirlo, mostra un errore che i file di intestazione non si trovano (Nessun file o directory con questo nome).

Sarebbe davvero grato se qualcuno potesse aiutarmi per favore. Grazie.

risposta

19

Probabilmente mancano una o più chiamate include_directories. L'aggiunta di intestazioni all'elenco di file nella chiamata add_executable in realtà non aggiunge poi al percorso di ricerca del compilatore, è una funzione di comodità in cui vengono aggiunti alla struttura di cartelle del progetto in IDE.

Così, nella vostra radice, supponiamo di avere /my_lib/foo.h, e si desidera includere che in un file di origine come

#include "my_lib/foo.h" 

Poi, nel tuo CMakeLists.txt, è necessario fare:

include_directories(${CMAKE_SOURCE_DIR}) 

Se invece si vuole solo fare

#include "foo.h" 

poi nel CMakeLists.txt, fare

include_directories(${CMAKE_SOURCE_DIR}/my_lib) 


devo dire che file(GLOB...) non è il metodo consigliato per raccogliere la vostra lista di fonti - si dovrebbe davvero basta aggiungere ogni file in modo esplicito nella CMakeLists.txt. In questo modo, se si aggiunge o si rimuove un file di origine in un secondo momento, CMakeLists.txt viene modificato e CMake ripete automaticamente la volta successiva che si tenta di creare. Dai documenti per file:

Non è consigliabile utilizzare GLOB per raccogliere un elenco di file di origine dall'albero dei sorgenti. Se nessun file CMakeLists.txt cambia quando viene aggiunta o rimossa una sorgente, il sistema di generazione generato non può sapere quando chiedere a CMake di rigenerare.

+15

ma preferirei rieseguire manualmente CMake che digitare ogni singolo file sorgente ... – Kapichu

+1

Sono sulla recinzione su questo. Sono d'accordo con il tuo punto, ma il contro-argomento di solito è che è abbastanza facile fare 'ls' o' dir' per ottenere l'elenco iniziale delle fonti, e quindi di solito stai solo aggiungendo uno o due file alla volta successiva . Se lavori per conto tuo, è abbastanza sicuro. Se fai parte di un team, devi "addestrare" il team affinché esegua sempre CMake dopo aver aggiunto un file o aggiornato da un VCS remoto nel caso in cui un file sia stato aggiunto da un altro membro del team. – Fraser

0

Giusto per chiarire ulteriormente un punto nella risposta di Fraser:

intestazioni non dovrebbe essere passato al ADD_EXECUTABLE.

La ragione è che il comando di compilazione previsto su Linux per esempio è solo:

gcc main.c mylib.c 

e non:

gcc main.c mylib.c mylib.h 

Il C pre-processore quindi analizza mylib.c, e vede un #include "mylib.h", e usa il suo percorso di ricerca per quei file.

Utilizzando invece include_directories, si modifica invece il percorso di ricerca del preprocessore cpp, che rappresenta l'approccio corretto. In GCC, questo si traduce in aggiunta alla bandiera -I alla riga di comando:

gcc -Inew/path/to/search/for/headers main.c mylib.c 
+0

Può essere utile elencare le intestazioni nel comando 'target_sources()', poiché le intestazioni elencate come sorgenti non verranno compilate direttamente per conto proprio, ma l'aggiunta di esse elencherà quelle intestazioni nel file del progetto all'interno degli IDE, anche se nessuna fonte il file # include loro direttamente. Nota: ovviamente questo è solo complementare all'utilizzo del comando 'include_directories()' – SebNag

Problemi correlati