Wie definiere ich eine Präprozessorvariable über CMake?
Der entsprechende Code wäre #define foo
.
quelle
Wie definiere ich eine Präprozessorvariable über CMake?
Der entsprechende Code wäre #define foo
.
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
wirftCMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Mussteadd_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 zumWhats 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:
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 .
quelle
target_compile_definitions(my_target PRIVATE FOO=1)
unterscheidet sich vonset_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.Mit CMake Version 3.3.2, um zu erstellen
Ich musste verwenden:
und um eine Präprozessor-Makrodefinition wie diese andere zu haben:
Die Linie ist so modifiziert:
quelle
add_definitions()
oder verwendentarget_compile_definitions()
. Der modernere Befehladd_compile_definitions()
wurde erst mit CMake 3.12 hinzugefügt. @ Leos313