2016-02-01 11 views
5

otrzymuję następujący błąd podczas kompilacji:błąd: „ASM” nierejestrowanej (pierwsze użycie w tej funkcji)

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

w pliku nagłówka, w którym makro jest wywołany następująco:

EXCHANGE(s, *(a)); 

i rzeczywistą definition makra jest następujący:

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

makro wywołania i definicja występuje w tym samym ogrzewania plik der. Co się dzieje źle?

Używam cmake do budowania projektu i CFLAGS są następujące:

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

nie próbować zatrzymać kompilację po pre-processing przy użyciu '-E'? – Aif

+0

Co to jest -E i jak mogę z niego korzystać? Buduję swój projekt za pomocą cmake. –

+2

Czy słowo kluczowe 'asm' jest obsługiwane przez twój kompilator? BTW jakiego kompilatora/environnement/IDE/OS używasz? –

Odpowiedz

6

Jesteś kompilacji z opcją -std=c99.

Spowoduje to wyłączenie niektórych niestandardowych rozszerzeń GCC, takich jak funkcja asm.

Aby uzyskać dokumentację (niezbyt precyzyjną), zobacz https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-std-112.

Usuń lub zmień linię set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") z pliku cmakefile, jeśli potrzebujesz wbudowanego zestawu.

+0

To raczej komentarz niż odpowiedź. –

+0

nope. Nie ma flagi '-ansi'. –

+0

Czysty, to dowiedziałem się, gdy zapytałem flagę kompilacji. Cieszę się, że to znaleźliśmy. – Aif

Powiązane problemy