2014-09-15 15 views
9

Ich versuche, die flatbuffers library CMakeLists.txt zu ändern, um PUBLIC einige Flags zu machen. Dann habe ich neu geschrieben diese Zeilen:target_compile_definitions mit mehreren Flags

Originalcode

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() 

Neuer Code

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() 

Der Zielname flatc ist und, wenn ich zu bauen beginnen die Projekt, bekomme ich folgendes:

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 

Ist die Konvertierung von "set (CMAKE_CXX_FLAGS)" in "target_compile_definitions()" falsch mit diesen Flags?

+1

die flatbuffers Entwickler Sagen Sie nicht fündig Modul zu versenden. Das bringt die Karte mit dem Schatz. Senden Sie stattdessen eine Konfigurationsdatei. http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html – steveire

Antwort

13

Der Unterschied ist, dass die alte Variable CMAKE_CXX_FLAGS eine einzelne durch Leerzeichen getrennte Zeichenkette mit allen Problemen (Entweichen, Manipulation usw.) ist, die dies bringt.

Die neueren Eigenschaften (wie jene, die von target_compile_definitions() gesetzt werden) arbeiten stattdessen auf CMake-Listen, eine Option pro Listenelement. Also entferne einfach die Anführungszeichen und du bist fertig. Und da du nicht wirklich Definitionen (Makros) vorbei, aber Optionen, verwenden target_compile_options() statt:

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

Es funktioniert !! ;) Danke vielmals! – fenix688