CMake aracılığıyla önişlemci makrosu tanımlansın mı?


283

CMake aracılığıyla bir önişlemci değişkenini nasıl tanımlayabilirim?

Eşdeğer kod olurdu #define foo.

Yanıtlar:


382

Uzun bir süre, CMake add_definitionsbu amaçla komuta etti. Bununla birlikte, son zamanlarda komutun yerini daha ince taneli bir yaklaşım almıştır (derleme tanımları için ayrı komutlar, dizinleri ve derleyici seçeneklerini içerir).

Yeni add_compile_definitions kullanan bir örnek :

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)

Veya:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

Bu konuda iyi tarafı, CMake'in yerinde olduğu perişan hileyi atlatmasıdır add_definitions. CMake böyle perişan bir sistem, ama sonunda bir akıl sağlığı buluyorlar.

Derleyici bayrakları için hangi komutların kullanılacağı hakkında daha fazla açıklama burada bulabilirsiniz: https://cmake.org/cmake/help/latest/command/add_definitions.html

Benzer şekilde, Jim Hunziker'in cevabında açıklandığı gibi bu hedef başına da yapabilirsiniz.


4
Bağlantılı sayfadan: "Not Bu komutun yerini alternatifler almıştır: Önişlemci tanımları eklemek için add_compile_definitions () kullanın." Belki bu cevabın bir düzeltmeye ihtiyacı vardır?
M.Herzkamp

9
Cmake 3.10.2'de add_compile_definitionsatar CMake Error at CMakeLists.txt:6 (add_compile_definitions): Unknown CMake command "add_compile_definitions".. add_compile_options(-D <your-def>)Bunun yerine kullanmak zorunda kaldı .
code_dredd

2
@mannyglover Ben öyle düşünmüyorum, ama derleyici bayraklarını -D ile cmake -D CMAKE_CXXFLAGS='-DDEBUG_CHESSBOARD'(test edilmedi) boyunca bir şey ayarlayabilirsiniz
ypnos

1
Gerçekten yeni ... aslında Daha Modern CMake'de (> 3.11). Bir komutun ne zaman verildiğini bilmek çok zor bir acı.
Sandburg

1
@Sandburg Son belgelere olan bağlantıyı açabilir: https://cmake.org/cmake/help/v3.17/command/add_compile_definitions.html#command:add_compile_definitionsve sayfa kaybolana kadar sürüm numarasını değiştirmeye başlayabilirsiniz. Bu henüz mevcut olmayan versiyon olurdu. Bir sonraki adımda Whats newyeni bir komut veya özellik bulmak için bölüme gidebilirsiniz . Yani o kadar zor değil.
Andry

245

Bunu belirli bir hedef için yapmak için aşağıdakileri yapabilirsiniz:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

Oluşturduğunuz birden fazla hedefiniz varsa ve hepsinin aynı bayrakları kullanmasını istemiyorsanız bunu yapmalısınız. Ayrıca target_compile_definitions ile ilgili resmi belgelere de bakın .


1
@JimHunziker Nasıl target_compile_definitions(my_target PRIVATE FOO=1)farklıdır set_source_files_properties(foo.cpp PROPERTIES COMPILE_DEFINITIONS -DFOO=1)?
John Strood

1
@JohnStrood Fark kapsam düzeyindedir. target_compile_definitionsWHOLE yürütülebilir / kitaplığı için değeri ayarlar; burada 'set_source_files_properties` sadece belirtilen dosya için değeri ayarlar. İkinci komut, dosyaların farklı bir dil kullanarak derlenmesini sağlar; yani: set_source_files_properties(compile_me_as_objc.c PROPERTIES -x objective-c. -x objective-cBurada GCC / Clang'a özgü bir bayrak olduğunu unutmayın .
Julian Kirsch

20

Bu sayfada önerilen diğer çözüm , Cmake <'nin bazı versiyonlarıdır3.3.2 . Burada kullandığım sürüm için çözüm (yani 3.3.2). Kullanarak Cmake sürümünüzü kontrol edin ve $ cmake --versionihtiyaçlarınıza uygun çözümü seçin. Cmake dokümantasyon resmi sayfasında bulunabilir.

CMake sürüm 3.3.2 ile, oluşturmak için

#define foo

Kullanmam gerekiyordu:

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

ve bunun gibi bir önişlemci makro tanımına sahip olmak için:

#define foo=5

satır çok değiştirildi:

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

4
Başına belgeler , bu çözüm aslında daha eski, daha eskimiş bir yaklaşımdır. Diğer cevaplar daha modern çözümler sunuyor.
squareskittles

2
Cevabı yazdığımda, diğer çözümü denedim ama hiçbiri işe yaramıyordu.
Leos313

@squareskittles, diğer cevabın çözümünün neden düzgün çalışmadığını biliyor musunuz? C: Onları
denersem

1
CMake 3.3.2 kullanıyorsanız, cevabınızda belirtildiği gibi, add_definitions()veya öğesini kullanmanız gerekir target_compile_definitions(). Daha modern komut, add_compile_definitions()CMake 3.12'ye kadar eklenmedi. @ Leos313
squareskittles

1
@squareskittles, cevabı güncelliyor, birkaç ay önce yazdıklarımı yeniden yazıyorum. Bunu işaret ettiğiniz için teşekkür ederiz
Leos313
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.