2014-09-15 4 views
9

Я пытаюсь изменить файл CMakeLists.txt , чтобы сделать PUBLIC несколько флагов. Тогда я переписал эти строки:target_compile_definitions с несколькими флагами

Оригинальный код

elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra") 
endif() 

Новый код

elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 
    target_compile_definitions(flatbuffers PUBLIC "-std=c++0x -Wall -pedantic -Werror -Wextra") 
endif() 

Целевое имя flatc и, когда я начинаю строить проект, я принимаю это:

Scanning dependencies of target flatc 
[ 7%] Building CXX object CMakeFiles/flatc.dir/src/idl_parser.cpp.obj 
<command-line>:0:1: error: macro names must be identifiers 

Неправильно ли преобразование «set (CMAKE_CXX_FLAGS)» в «target_compile_definitions()» с этими флагами?

+1

Сообщите разработчик flatbuffers не грузить модуль найти. Это кладет карту сокровищами. Вместо этого отправьте конфигурационный файл. http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html – steveire

ответ

13

Разница заключается в том, что старая переменная CMAKE_CXX_FLAGS представляет собой единую разделительную строку, содержащую все проблемы (экранирование, манипуляции и т. Д.), Которые это приводит.

Более новые свойства (например, установленные target_compile_definitions()) работают вместо списков CMake, по одному элементу списка. Поэтому просто удалите кавычки, и вы настроены. И, так как вы на самом деле не проходите определения (макросы), но варианты, использовать target_compile_options() вместо:

elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") 
    target_compile_options(flatbuffers PUBLIC -std=c++0x -Wall -pedantic -Werror -Wextra) 
endif() 
+0

Это работает !! ;) Большое спасибо! – fenix688

Смежные вопросы