Windows环境Cython调用C内联汇编报unresolved external symbol asm错误如何解决
错误原因
你当前使用的是MSVC编译器进行代码编译,MSVC和GCC的内联汇编语法不兼容:
- 32位模式下MSVC仅支持
__asm关键字实现内联汇编,不识别GCC风格的asm关键字 - 64位模式下MSVC直接不支持内联汇编写法,你代码中的
asm("nop")会被MSVC判定为未定义的外部函数,因此链接阶段抛出找不到asm符号的错误。
解决方法
你可以根据自己的使用场景任选以下方案:
方案1:更换MinGW编译器编译
MinGW是GCC的Windows移植版本,原生支持GCC风格的asm内联汇编语法,你只需要先安装配置好MinGW环境,编译时指定编译器即可:
python setup.py build_ext --inplace --compiler=mingw32 && python program.py
方案2:适配MSVC编译规则
如果你需要坚持使用MSVC编译,分场景修改:
- 若你编译的是32位程序:将
asm("nop")替换为MSVC专属的32位内联汇编写法__asm { nop }即可 - 若你编译的是64位程序:MSVC 64位模式不支持内联汇编,你需要将汇编代码单独写入
.asm文件,用MASM编译为目标文件后和Cython生成的C代码共同链接即可。
方案3:使用MSVC内置函数替代(针对nop指令场景)
如果你只是需要调用nop指令,不需要写其他自定义汇编,直接使用MSVC提供的内置函数__nop()即可,无需自行实现汇编逻辑,修改后的代码如下:
cdef extern from *: """ #include <stdio.h> #include <intrin.h> void print_endln(){ __nop(); } """ void print_endln() print_endln()
该写法同时兼容32位和64位的MSVC编译环境。
内容的提问来源于stack exchange,提问作者hashy
相关产品推荐
相关产品推荐

