2017-06-19 86 views
1

我有這樣一個項目:如何使用不同的編譯選項爲CMAKE中的不同文件編譯?

|--CMakeLists.txt(1) 
|--File1.cpp -W -W-all 
|--Folder1 
    |--CMakeLists.txt(2) 
    |--File2.cpp -W -W-all -fno-rtti 

正如你可以在上面看到,File2.cpp需要與-fno-rtti編譯,而其他文件應與rtti編譯。這是因爲我在我的項目中使用了clang和boost庫。 我寫了CMakeLists.txt(1)這樣的:

SET (CMAKE_CXX_FLAGS "-std=c++11 -fexceptions -fno-rtti -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -Wno-long-long") 

而且,在CMakeLists.txt(2)我增加了以下內容:

add_definitions(-fno-rtti) 

以上沒有工作。事實上沒有以下的都在的CMakeLists.txt爲我工作(2)

set_property(SOURCE File2.cpp APPEND_STRING PROPERTY CMAKE_CXX_FLAGS " -fno-rtti ") 
set_property(SOURCE File2.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -fno-rtti ") 
ADD_DEFINITIONS(CMAKE_CXX_FLAGS " -fno-rtti ") 
ADD_DEFINITIONS(COMPILE_FLAGS " -fno-rtti ") 
ADD_DEFINITIONS(-fno-rtti) 

我錯過了什麼?

+1

你怎麼知道它沒不工作?你會得到什麼錯誤?你有沒有試過[這](https://stackoverflow.com/questions/2670121/using-cmake-with-gnu-make-how-can-i-see-the-exact-commands)? – Florian

回答

4

AFAIK CMake不允許指定每個文件的編譯選項。您可以做的最好的方法是爲要編譯的文件創建一個目標文件,例如-fno-rtti,例如與add_library,並將編譯選項添加到此目標。

add_definitions旨在添加預處理器定義。你應該考慮add_compile_options代替:

add_compile_options(-fno-rtti) 

爲了避免全球污染,並確保您添加選項給定的目標,你可以考慮使用target_compile_options

target_compile_options(foo PUBLIC -fno-rtti) 

無關,但不是手動設置標誌來啓用c + + 11與set(CMAKE_CXX_FLAGS "-std=c++11 ..."),讓cmake用compile features做一個更細緻的工作,或者至少用標準選擇:

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

編輯:

文檔中尋找更多的細心,你可以設置使用編譯每個源文件的標誌set_source_files_propertiesCOMPILE_FLAGS

set_source_files_properties(File2.cpp PROPERTIES COMPILE_FLAGS -fno-rtti) 
+0

爲了避免全球污染,使用'PRIVATE'而不是'PUBLIC'目標編譯選項會不會更好? – Florian

+0

我接受這個答案,但修復實際上在CmakeLists.txt(2)中。我沒有爲這個單獨的文件構建(通過調用add_library)。一旦我添加了add_library,並將其鏈接到頂層,就沒問題。不知道是否有一種解決方法(必須是),而不需要從這個文件中創建一個lib。例如。在XCODE中,我們可以直接指定哪些文件需要使用哪些選項進行編譯並生成一個可執行文件。 Cmake允許嗎?如果是,我應該在CMakeLists.txt(2)中添加什麼? –

+0

@UkkarshKumar我重讀你的問題和文檔,'set_source_files_properties'應該適合你。在你的問題中,你在'File1.cpp'而不是'File2.cpp'上使用它:是一個錯字嗎? – wasthishelpful

相關問題