简体   繁体   中英

How to compile with different compile options for different files in CMAKE?

I have a project like this:

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

As you can see above, File2.cpp needs to compile with -fno-rtti whereas the other files should compile with rtti . This is happening because I'm using both clang and boost libraries in my project. I wrote CMakeLists.txt(1) like this:

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

And, in CMakeLists.txt(2) I added the following:

add_definitions( -fno-rtti ) 

The above did not work. In fact none of the following have worked for me in 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 )

Am I missing anything?

AFAIK CMake does not allow to specify compile options per file. The best you can do is to create a target for the files you want to compile with -fno-rtti , eg with add_library , and add the compile options to this target.

add_definitions is meant to add preprocessor definitions. You should consider add_compile_options instead:

add_compile_options(-fno-rtti)

To avoid global pollution and make sure you add your options only to a given target, you may consider using target_compile_options :

target_compile_options(foo PUBLIC -fno-rtti)

Unrelated, but instead of manually setting flags to enable c++11 with set(CMAKE_CXX_FLAGS "-std=c++11 ...") , let cmake do a more fine grained job with compile features , or at least with standard selection:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

EDIT:

Looking more carefully in the documentation, you can set compile flags per source file using set_source_files_properties with COMPILE_FLAGS :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM