Yukarıdaki girişimleriniz, beklediğiniz gibi üzerine yazmak yerine dosyanıza / hedefinize daha fazla bayrak ekliyor. Örneğin, Kaynak Dosyalardaki Mülkler - COMPILE_FLAGS dokümanlarından :
Bu bayraklar, bu kaynak dosya oluşturulduğunda derleme bayrakları listesine eklenecektir.
Bunu -Weffc++
yaparak foo.cpp bayrağına karşı koyabilmelisiniz
set_source_files_properties(foo.cpp PROPERTIES COMPILE_FLAGS -Wno-effc++)
Bu , derleyici komutunda -Wno-effc++
sonrasını ekleme etkisine sahip olmalıdır -Weffc++
ve ikinci ayar kazanır. Tam komutu görmek ve durumun gerçekten böyle olup olmadığını kontrol etmek için şunları yapabilirsiniz:
make VERBOSE=1
Bir kenara, GNU C ++ Standart Kitaplığı'nın geliştiricilerinden -Weffc++
biri bu cevapta oldukça olumsuz bir görüş sunuyor .
Bir başka nokta da, bunu add_definitions
amaçlanan önişlemci tanımları yerine derleyici bayrakları için kullandığınız anlamında kötüye kullandığınızdır .
Kullanılması tercih edilir add_compile_options
add_compile_options(-Wall -Weffc++ -pedantic -std=c++0x)
veya CMake <3.0 sürümleri için daha fazlasını yapmak için:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Weffc++ -pedantic -std=c++0x")
Aşağıdaki yorumlarda yer alan başka sorulara yanıt olarak, tek bir dosyadaki bir bayrağı güvenilir bir şekilde kaldırmanın imkansız olduğuna inanıyorum . Nedeni herhangi bir kaynak dosyası için, bu olmasıdır COMPILE_OPTIONS
ve 1 hedefinin uygulanan, ancak bu o kaynak dosyasının özelliklerinde herhangi görünmüyor.COMPILE_FLAGS
Sorun bayrağını hedeften çıkarabilir COMPILE_OPTIONS
, ardından bunu hedefin kaynaklarının her birine ayrı ayrı uygulayabilir ve gerektiğinde belirli kaynak dosyadan çıkarabilirsiniz.
Bununla birlikte, bu birçok senaryoda işe yarayabilirken, birkaç sorunu vardır.
İlk - kaynak dosyalarının özellikleriCOMPILE_OPTIONS
yalnızca içermez COMPILE_FLAGS
. Bu bir sorundur çünkü COMPILE_OPTIONS
bir hedefin oluşturucu ifadeleri olabilir , ancak COMPILE_FLAGS
bunları desteklemez. Bu nedenle, bayrağınızı ararken üretici ifadelerine yer vermeniz gerekir ve hatta belki de bayrağınız bir veya daha fazlasında yer alıyorsa, kalan kısma yeniden uygulanıp uygulanmayacağını görmek için oluşturucu ifadelerini "ayrıştırmanız" gerekebilir. kaynak dosyaları.
İkinci olarak - CMake v3.0'dan beri hedefler belirleyebilir INTERFACE_COMPILE_OPTIONS
. Bu, hedefinizin bağımlılığının, hedeflerinize COMPILE_OPTIONS
onun aracılığıyla ekleyebileceği veya geçersiz kılabileceği anlamına gelir INTERFACE_COMPILE_OPTIONS
. Bu nedenle LINK_LIBRARIES
, sorun bayrağını uygulayanları bulmak için hedefinizin tüm bağımlılıklarını yinelemeli olarak yinelemeniz gerekir (hedefin listesi aynı zamanda üreteç ifadeleri de içerebilir, çünkü özellikle kolay bir görev değildir ) ve bunu bunlardan kaldırmaya çalışın. hedefler INTERFACE_COMPILE_OPTIONS
de.
Karmaşıklığın bu aşamasında, belirli bir bayrağı bir kaynak dosyadan koşulsuz olarak kaldırma işlevselliğini sağlamak için CMake'ye bir yama göndermek istiyorum.
1: COMPILE_FLAGS
Kaynak dosyalardaki özelliğin aksine, COMPILE_FLAGS
hedeflerdeki özelliğin kullanımdan kaldırıldığını unutmayın.