神威编译关于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里面.
    我其实也不明白为什么这么蛋疼.


登录后回复