使用Emscripten编译Python链接主程序时遇hypot符号重定义错误
解决Emscripten编译Python时
hypot符号多重定义问题 排查额外的符号来源
Emscripten自带的libc/libm运行时本身就可能提供hypot实现,和Python pymath.c里的定义撞了。别光用grep查,试试用nm命令扫目标文件和系统库:# 检查Python目标文件 nm -g python.o | grep hypot # 检查你的主程序目标文件 nm -g your_main_program.o | grep hypot # 检查Emscripten的系统math库 nm $(emcc --show-system-libs | grep libm) | grep hypot大概率能找到另一处
hypot的定义。让Python复用系统的
hypot
改Python的编译参数,加-DHAVE_HYPOT宏,强制Python用Emscripten提供的hypot,放弃自己的定义。编译Python时把CFLAGS改成:CFLAGS="-DHAVE_HYPOT"重新编译Python目标文件再链接试试。
用链接选项强制处理冲突
如果上面的方法没用,试试链接时的参数:- 要是想保留系统的
hypot,可以调整链接顺序,先链Emscripten的libm,再链Python目标文件,让链接器优先选系统符号; - 实在没辙可以临时用
-Wl,--allow-multiple-definition跳过错误,但这是权宜之计,可能埋下其他隐患。
- 要是想保留系统的
检查主程序的依赖库
你的主程序依赖的其他库(比如SDL、第三方数学库)说不定也藏着hypot定义,用nm扫一遍这些库的目标文件看看。
内容的提问来源于stack exchange,提问作者got here
相关产品推荐
相关产品推荐

