Jak zdefiniować zmienną preprocesora za pomocą CMake?
Równoważny kod to #define foo
.
źródło
Jak zdefiniować zmienną preprocesora za pomocą CMake?
Równoważny kod to #define foo
.
Przez długi czas CMake miał add_definitions
do tego polecenie. Jednak ostatnio polecenie to zostało zastąpione bardziej szczegółowym podejściem (osobne polecenia dla definicji kompilacji, obejmują katalogi i opcje kompilatora).
Przykład użycia nowych definicji add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Lub:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Zaletą tego jest to, że omija odrapane sztuczki, dla których przygotował CMake add_definitions
. CMake to taki obskurny system, ale w końcu zaczynają szukać zdrowia psychicznego.
Znajdź więcej wyjaśnień na temat poleceń używanych w flagach kompilatora tutaj: https://cmake.org/cmake/help/latest/command/add_definitions.html
Podobnie możesz zrobić to dla każdego celu, jak wyjaśniono w odpowiedzi Jima Hunzikera.
add_compile_definitions
rzutyCMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
.add_compile_options(-D <your-def>)
Zamiast tego musiałem użyć .cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(nie testowane)https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
i zacznij zmieniać numer wersji, aż strona zniknie. To byłaby wersja, w której jeszcze nie istnieje. W następnym ruchu możesz przejść doWhats new
sekcji, aby znaleźć nowe polecenie lub funkcję. Więc to nie takie trudne.Aby to zrobić dla określonego celu, możesz wykonać następujące czynności:
Powinieneś to zrobić, jeśli budujesz więcej niż jeden cel i nie chcesz, aby wszystkie używały tych samych flag. Zobacz także oficjalną dokumentację na temat definicji_pliku_docelowego .
źródło
target_compile_definitions(my_target PRIVATE FOO=1)
różniset_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?target_compile_definitions
ustawia wartość dla CAŁEGO pliku wykonywalnego / biblioteki, gdzie jako „set_source_files_properties” ustawia wartość tylko dla określonego pliku. Polecenie Później pozwala na kompilację plików w innym języku; tjset_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. : Pamiętaj, że-x objective-c
tutaj jest flaga specyficzna dla GCC / Clang.Z CMake w wersji 3.3.2, w celu utworzenia
Musiałem użyć:
i, aby mieć definicję makra preprocesora, taką jak ta inna:
linia jest tak zmodyfikowana:
źródło
add_definitions()
lubtarget_compile_definitions()
. Bardziej nowoczesne polecenieadd_compile_definitions()
zostało dodane dopiero w CMake 3.12. @ Leos313