Risposte:
Per molto tempo, CMake ha avuto il add_definitions
comando per questo scopo. Tuttavia, recentemente il comando è stato sostituito da un approccio più fine (comandi separati per le definizioni di compilazione, include le directory e le opzioni del compilatore).
Un esempio che utilizza le nuove add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
O:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
La parte buona di questo è che elude il trucco malandato per cui CMake è in atto add_definitions
. CMake è un sistema così malandato, ma stanno finalmente trovando un po 'di buonsenso.
Trova ulteriori spiegazioni su quali comandi utilizzare per i flag del compilatore qui: https://cmake.org/cmake/help/latest/command/add_definitions.html
Allo stesso modo, puoi fare questo per bersaglio come spiegato nella risposta di Jim Hunziker.
add_compile_definitions
genera CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Dovevo usare add_compile_options(-D <your-def>)
invece.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(non testato)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
e iniziare a modificare il numero di versione verso il basso fino alla scomparsa della pagina. Questa sarebbe la versione in cui non esiste ancora. Nella prossima mossa puoi andare alla Whats new
sezione per trovare un nuovo comando o funzione. Quindi non è così difficile.
Per fare ciò per un obiettivo specifico, puoi fare quanto segue:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Dovresti farlo se hai più di un obiettivo che stai costruendo e non vuoi che tutti usino le stesse bandiere. Vedi anche la documentazione ufficiale su target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
differisce da set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
imposta il valore per l'intero eseguibile / libreria, dove come 'set_source_files_properties` imposta il valore solo per il file specificato. Il comando Latter consente di compilare i file utilizzando una lingua diversa; Per esempio: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Nota che -x objective-c
qui c'è un flag specifico per GCC / Clang.
L'altra soluzione proposta in questa pagina sono utili alcune versioni di Cmake <
3.3.2
. Qui la soluzione per la versione che sto usando (cioè,3.3.2
). Controlla la versione di Cmake utilizzando$ cmake --version
e scegli la soluzione adatta alle tue esigenze. La documentazione di cmake è disponibile sulla pagina ufficiale.
Con CMake versione 3.3.2, per creare
#define foo
Avevo bisogno di usare:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
e, per avere una definizione di macro del preprocessore come questa:
#define foo=5
la linea è così modificata:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
o target_compile_definitions()
. Il comando più moderno, add_compile_definitions()
non è stato aggiunto fino a CMake 3.12. @ Leos313