2012-02-18 9 views
27

Dato che ho definito un eseguibile con il suo file sorgente principale in un file CMakeList.txt:È possibile aggiungere ulteriori file di origine a un file eseguibile una volta definito?

ADD_EXECUTABLE(MyExampleApp main.cpp) 

Posso aggiungere ulteriori file di origine di questo eseguibile dopo questa linea, ma nello stesso o in un file di incluso CMakeList.txt?

+3

Normalmente lo si fa usando le variabili invece dei file sul ADD_EXECUTABLE) di linea (. – drescherjm

+4

@drescherjm ha fornito la risposta corretta: basta raccogliere le sorgenti con 'lista (APPEND SOURCES src.cpp src2.cpp)' o 'set (SOURCES src.cpp)' e 'set (SOURCES $ {SOURCES} src2.cpp)'. – arrowd

+0

Grazie. Lo stavo facendo in quel modo ma sembrava in qualche modo bruteforce. Comunque. Sta funzionando. –

risposta

32

Usa target_sources, disponibile dal CMake 3,1

ad es. target_sources(MyExampleApp PUBLIC ${extra_file})

https://cmake.org/cmake/help/v3.1/command/target_sources.html

+1

Se il target è una libreria (non eseguibile), questo trucco funziona anche, ma dovresti usare 'PRIVATE' invece di' PUBLIC', altrimenti il ​​particolare file sorgente verrà collegato due volte. –

8

penso che si può usare:

add_executable(MyExampleApp main.cpp) 
add_library(library STATIC ${ADDITIONAL_SOURCES}) 
set_target_properties(library PROPERTIES 
    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) 
target_link_libraries(MyExampleApp library) 
+1

soluzione interessante per questo problema :) intelligente –

+0

Va notato che questo non funziona per i file di risorse (.rc) di Windows immediatamente, anche se normalmente possono essere forniti come file di origine in 'add_library()' . CMake lamenta che la variabile "CMAKE_RC_CREATE_STATIC_LIBRARY" non è impostata. La soluzione alternativa consiste anche nel includere un file sorgente .c vuoto. –

3

Va notato che per le versioni più recenti di CMake (> 3.1 credo) si possono aggiungere file alla proprietà SOURCES su obiettivi.

http://www.cmake.org/cmake/help/v3.3/prop_tgt/SOURCES.html

+3

Oppure potresti semplicemente usare ['target_sources()'] (http://www.cmake.org/cmake/help/v3.3/command/target_sources.html?highlight=target_sources) (vedi la risposta di DarthB [qui] (http://stackoverflow.com/a/31541070/4763489)). – Florian

Problemi correlati