错误:'asm'未声明(首次在此函数中使用) [英] error: ‘asm’ undeclared (first use in this function)

查看:1675
本文介绍了错误:'asm'未声明(首次在此函数中使用)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在编译期间出现以下错误:

 错误:'asm'未声明(在此函数中首次使用)
EXCHANGE(s,*(a));

在调用宏的头文件中,如下所示:

  EXCHANGE(s,*(a)); 

以及宏的实际定义如下:

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

宏调用和定义存在于同一个头文件中。
出了什么问题?

我使用CMAKE来构建项目和CFLAGS如下所示:



< (CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Wall)
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Werror)
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS }
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Wno-missing-braces)
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Wno-missing-field-initializers)$ b $ (CMAKE_C_FLAGS-WMETT = 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用于抑制旧版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 (CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Wshadow)
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -Wunreachable-code)
set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} )
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)


解决方案

使用选项 -std = c99 进行编译。



这会禁用某些非标准GC C扩展,如 asm 功能。



请参阅 https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index- (非精确)文档。



删除或更改行 set(CMAKE_C_FLAGS$ {CMAKE_C_FLAGS} -std = c99),如果你需要内联汇编的话,可以从你的cmake文件中找到。


I am getting the following error during compilation:

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

in a header file where the macro is invoked as follows:

EXCHANGE( s, *(a) );

and the actual defintion of the macro is as follows:

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

Macro invocation and definition exists in same header file. What's going wrong?

I am using CMAKE to build the project and CFLAGS are as follows:

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

解决方案

You are compiling with option -std=c99.

This disables some non-standard GCC extensions like the asm feature.

See https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-std-112 for some (not very precise) documentation.

Remove or change the line set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") from your cmakefile if you need inline assembly.

这篇关于错误:'asm'未声明(首次在此函数中使用)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆