2016-02-01 9 views
5

Ich erhalte den folgenden Fehler beim Kompilieren:Fehler: 'asm' nicht deklariert (erste Benutzung in dieser Funktion)

error: ‘asm’ undeclared (first use in this function) 
EXCHANGE(s, *(a)); 
^ 

in einer Header-Datei, in der das Makro wie folgt aufgerufen wird:

EXCHANGE(s, *(a)); 

und die tatsächliche defintion des Makros ist wie folgt:

#define EXCHANGE(R,M) asm volatile ("xchg %1, %0" : "+m" (M), "+r" (R)) 

Makroaufruf und Definition in gleicher HEA existieren der Datei. Was läuft falsch?

ich CMAKE bin mit dem Projekt und CFLAGS zu bauen sind wie folgt:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-braces") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-missing-field-initializers") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wformat=2") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wswitch-default") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wcast-align") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith") 
#-Wno-deprecated-declarations to suppress the deprecation errors with newer version of JSON-C 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") 
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wbad-function-cast") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-overflow=5") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Winline") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wundef") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wnested-externs") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-cast-qual") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunreachable-code") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wfloat-equal") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wstrict-aliasing=2") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wredundant-decls") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wold-style-definition") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-parameter") 
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") 

#set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -O0 -g3 -ggdb") 
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -O3") 
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -E") 
+1

verwendet werden, können haben sie versucht, Zusammenstellung nach Vorbearbeitung mit '-E' zu stoppen? – Aif

+0

Was ist -E und wie kann ich es benutzen? Ich baue mein Projekt über cmake. –

+2

Ist das 'asm' Schlüsselwort von Ihrem Compiler unterstützt. BTW welchen Compiler/Environment/IDE/OS verwendest du? –

Antwort

6

Sie mit -std=c99 Option kompiliert werden.

Dadurch werden einige nicht standardmäßige GCC-Erweiterungen wie die asm-Funktion deaktiviert.

Für einige (nicht sehr genaue) Dokumentation siehe https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-std-112.

Entfernen oder ändern Sie die Zeile set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") von Ihrer cmakefile, wenn Sie eine Inline-Montage benötigen.

+0

Dies ist eher ein Kommentar als eine Antwort. –

+0

nein. Keine '-ansi'-Flagge. –

+0

Ordentlich, das habe ich herausgefunden, als ich die Kompilierungsflagge gefragt habe. Froh, dass wir es gefunden haben. – Aif