神威编译关于math.h报错
-
sw5cc -slave 编译从核代码(计算部分有sqrt等),编译报错如下:
In file included from /usr/sw-mpp/swcc/sw5gcc-binary/bin/../lib/gcc/sw_64thl-unknown-linux-gnu/4.1.2/../../../../sw_64thl-unknown-linux-gnu/sys-include/math.h:72
将从核代码所有计算部分摘离并添加main。编译:g++和gcc -lm 可以编译通过,gcc、sw5cc和sw5cc -lm 均无法编译通过。
从核代码含大量数学计算函数,求教解决方案~ ^ ^
-
sw5cc -host -c master.c sw5cc -slave -c slave.c sw5cc -hybrid master.o slave.o -lm_slave -o example-c
-
-lm_slave
-
@桑薇 多谢~link确实要用-lm_slave选项,不然会找不到数学库,多谢 ^ ^
不过,我之前的问题是从核代码编译没过,问题已经找到。
从核代码中有一行宏:
define y0 12#
会报我之前那个错,略玄学。还不知道什么原因,y0这个名字可能和系统库有冲突(将这一行宏分别放在#include <math.h>上下行,前者报错)。
还请教个问题,如果主核代码也包含tan、pow等函数,link的时候该用什么指令。slave_tan找到了,但是主核的tan找不到..
我的link指令:sw5cc -hybrid -msimd -lm -lm_slave host.o slave.o -o real_case1.0
编译可以过,link出错。主核代码行:xxx:undefined reference to `tan'
-
把-lm和-lm_slave放到两个.o后面试一试.
或者-Wl,--whole-archive -lm -lm_slave -Wl,--no-whole-archive试一试.
-
@夜深忽梦少年事 多谢,把-lm 、-lm_slave 放.o后面可以~。 求告知原理(是跟link顺序有关吗),我做一下记录,免得别人在踩坑 ~^ ^
-
@czp 讲道理两个应该都可以...
链接静态库会有这个问题.
然后sw5cc都是静态链接.
静态链接的过程相当于:call_list = [] link_list = [] for parameter in parameter_list: if parameter.endswith(".o"): for function in parameter.find_external_function_call(): call_list.append(function) if parameter.endswith(".a") or parameter.startswith("-l"): for function in parameter.get_functions(): if function in call_list: link_list.append(function) for function in call_list: if function not in link_list: print("undefined reference to " + function)
大概很抽象的描述一下就是这样的...
所以你的.a
或者-l
放在.o
前面,call_list
是空的, 于是就认为: 你不需要这个静态库里面的任何函数, pass掉这个静态库.
用-Wl,--whole-archive
也是为了解决这个问题, 方式是强制把这个静态库里面所有东西丢到link_list
里面.
我其实也不明白为什么这么蛋疼.