Jawaban:
Untuk waktu yang lama, CMake memiliki add_definitions
perintah untuk tujuan ini. Namun, baru-baru ini perintah telah digantikan oleh pendekatan berbutir lebih halus (perintah terpisah untuk definisi kompilasi, termasuk direktori, dan opsi kompiler).
Contoh menggunakan add_compile_definitions baru :
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)
Atau:
add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)
Bagian yang baik tentang ini adalah bahwa hal itu menghindari tipu daya kumuh CMake di tempat untuk add_definitions
. CMake adalah sistem yang buruk, tetapi mereka akhirnya menemukan kewarasan.
Temukan penjelasan lebih lanjut tentang perintah mana yang digunakan untuk flag kompiler di sini: https://cmake.org/cmake/help/latest/command/add_definitions.html
Demikian juga, Anda dapat melakukan ini per-target seperti yang dijelaskan dalam jawaban Jim Hunziker.
add_compile_definitions
melempar CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
. Harus digunakan add_compile_options(-D <your-def>)
sebagai gantinya.
cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'
(tidak diuji)
https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitions
dan mulai mengubah nomor versi ke bawah hingga halaman hilang. Itu akan menjadi versi di mana itu belum ada. Pada langkah selanjutnya Anda dapat pergi ke Whats new
bagian untuk menemukan perintah atau fitur baru. Jadi tidak begitu sulit.
Untuk melakukan ini untuk target tertentu, Anda dapat melakukan hal berikut:
target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)
Anda harus melakukan ini jika Anda memiliki lebih dari satu target yang sedang Anda bangun dan Anda tidak ingin mereka semua menggunakan bendera yang sama. Lihat juga dokumentasi resmi tentang target_compile_definitions .
target_compile_definitions(my_target PRIVATE FOO=1)
bedanya set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)
?
target_compile_definitions
set nilai untuk WHOLE executable / library, di mana 'set_source_files_properties` menetapkan nilai hanya untuk file yang ditentukan. Perintah terakhir memungkinkan file dikompilasi menggunakan bahasa yang berbeda; yaitu: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c
. Perhatikan bahwa -x objective-c
ini adalah flag khusus untuk GCC / Dentang.
Solusi lain yang diusulkan pada halaman ini berguna beberapa versi Cmake <
3.3.2
. Di sini solusi untuk versi yang saya gunakan (yaitu,3.3.2
). Periksa versi Cmake Anda dengan menggunakan$ cmake --version
dan memilih solusi yang sesuai dengan kebutuhan Anda. The dokumentasi cmake dapat ditemukan di halaman resmi.
Dengan CMake versi 3.3.2, untuk membuat
#define foo
Saya perlu menggunakan:
add_definitions(-Dfoo) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
dan, untuk memiliki definisi makro preprosesor seperti yang lain ini:
#define foo=5
garis sangat dimodifikasi:
add_definitions(-Dfoo=5) # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)
add_definitions()
atau target_compile_definitions()
. Perintah yang lebih modern add_compile_definitions()
,, tidak ditambahkan sampai CMake 3.12. @ Leos313