Antworten:
CMake hatte lange Zeit den add_definitions
Befehl zu diesem Zweck. In letzter Zeit wurde der Befehl jedoch durch einen differenzierteren Ansatz ersetzt (separate Befehle zum Kompilieren von Definitionen, Include-Verzeichnisse und Compiler-Optionen).
Ein Beispiel mit den neuen add_compile_definitions :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Oder:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Das Gute daran ist, dass es die schäbigen Tricks umgeht, für die CMake eingesetzt hat add_definitions
. CMake ist so ein schäbiges System, aber sie finden endlich etwas Vernunft.
Weitere Erläuterungen zu den für Compiler-Flags zu verwendenden Befehlen finden Sie hier: https://cmake.org/cmake/help/latest/command/add_definitions.html
Ebenso können Sie dies pro Ziel tun, wie in der Antwort von Jim Hunziker erläutert.
add_compile_definitions
wirft CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Musste add_compile_options(-D <your-def>)
stattdessen verwenden.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(nicht getestet)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
und die Versionsnummer nach unten ändern, bis die Seite verschwindet. Das wäre die Version, in der es noch nicht existiert. Im nächsten Schritt können Sie zum Whats new
Abschnitt gehen, um einen neuen Befehl oder eine neue Funktion zu finden. Es ist also nicht so schwer.
Um dies für ein bestimmtes Ziel zu tun, können Sie Folgendes tun:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Sie sollten dies tun, wenn Sie mehr als ein Ziel haben, das Sie erstellen, und nicht möchten, dass alle dieselben Flags verwenden. Siehe auch die offizielle Dokumentation zu target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
unterscheidet sich von set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
Legt den Wert für die GANZE ausführbare Datei / Bibliothek fest, wobei 'set_source_files_properties' den Wert nur für die angegebene Datei festlegt. Mit dem letzten Befehl können Dateien in einer anderen Sprache kompiliert werden. dh : set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Beachten Sie, dass -x objective-c
hier ein für GCC / Clang spezifisches Flag angegeben ist.
Die andere auf dieser Seite vorgeschlagene Lösung ist für einige Versionen von Cmake <
3.3.2
nützlich . Hier die Lösung für die Version, die ich verwende (dh3.3.2
). Überprüfen Sie die Version Ihres Cmake, indem Sie$ cmake --version
die Lösung verwenden und auswählen, die Ihren Anforderungen entspricht. Die cmake-Dokumentation finden Sie auf der offiziellen Seite.
Mit CMake Version 3.3.2, um zu erstellen
#define foo
Ich musste verwenden:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
und um eine Präprozessor-Makrodefinition wie diese andere zu haben:
#define foo=5
Die Linie ist so modifiziert:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
oder verwenden target_compile_definitions()
. Der modernere Befehl add_compile_definitions()
wurde erst mit CMake 3.12 hinzugefügt. @ Leos313