Dopo aver mescolato le fonti C e C++, la proprietà LINKER_LANGUAGE
potrebbe applicare le bandiere sbagliate per la compilazione delle singole fonti. La soluzione è utilizzare l'espressione del generatore COMPILE_LANGUAGE
(introdotta con CMake 3.3). L'esempio più semplice per la tua bandiera originale C++ 1x è:
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=c++11>)
Quando si dispone di una serie di opzioni di compilazione (ad esempio, per l'utilizzo con la proprietà COMPILE_FLAGS
target), è necessario dividere le bandiere
set(WARNCFLAGS "-Wall -Wextra -Wfuzzle -Wbar")
# ...
string(REPLACE " " ";" c_flags "${WARNCFLAGS}")
string(REPLACE " " ";" cxx_flags "${WARNCXXFLAGS} ${CXX1XCXXFLAGS}")
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
"$<$<COMPILE_LANGUAGE:CXX>:${cxx_flags}>"
)
# Two alternative variants for single targets that take strings:
target_compile_options(some-target PRIVATE "${WARNCFLAGS}")
set_target_properties(some-target PROPERTIES
COMPILE_FLAGS "${WARNCFLAGS}")
L'utilizzo di stringhe è tuttavia deprecato a favore delle liste. Quando gli elenchi sono in uso, è possibile utilizzare:
set(c_flags -Wall -Wextra -Wfuzzle -Wbar)
# ...
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
"$<$<COMPILE_LANGUAGE:CXX>:${cxx_flags}>"
)
# Two alternative variants for single targets given a list:
target_compile_options(some-target PRIVATE ${f_flags})
set_target_properties(some-target PROPERTIES
COMPILE_OPTIONS "${c_flags}")
Prestare attenzione al preventivo. Se un elenco non è un preventivo, viene esteso ai suoi elementi (e non è più un elenco). Per passare una lista tra i comandi, citala.
stai usando g ++/gcc? –
O g ++/gcc o clang, a seconda della piattaforma. –
Potresti dare un'occhiata al comando sperimentale ['target_compile_features'] (http://www.steveire.com/cmake-future/manual/cmake-compile-features.7.html) che ci permetterebbe di ottenere sbarazzarsi di flag di compilazione non portatili per questo caso d'uso del tutto. A partire da ora (CMake 3.0.1) questa funzione non viene fornita con CMake, ma dovremmo farlo con una delle prossime versioni. – ComicSansMS