Tinyos 2.1.2 ubuntu下基于python的TOSSIM仿真出现问题

在Ubuntu虚拟机中安装了Tinyos2.1.2,需要进行基于Python的仿真,利用TOSSIM工具,具体的步骤如下:

https://blog.csdn.net/HoraceYan/article/details/130295664

执行指令:make micaz sim
成功生成文件TOSSIM.py,但是执行下一步输入指令:from TOSSIM import *,报错如下:

>>> from TOSSIM import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "TOSSIM.py", line 7, in <module>
    import _TOSSIM
ImportError: ./_TOSSIMmodule.so: undefined symbol: __nesc_atomic_end

按照网上的教程:https://www.cnblogs.com/ziyu-trip/p/11541447.html
得知gcc,g++版本过新,需要降级,但是将gcc和g++版本降至4.8后再执行指令:make micaz sim,报错如下:

root@user-virtual-machine:/opt/tinyos-2.1.2/apps/RadioCountToLeds# make micaz sim
mkdir -p simbuild/micaz
  placing object files in simbuild/micaz
  writing XML schema to app.xml
  compiling RadioCountToLedsAppC to object file sim.o
ncc -c -shared -fPIC -o simbuild/micaz/sim.o -g -O0 -tossim -fnesc-nido-tosnodes=1000 -fnesc-simulate -fnesc-nido-motenumber=sim_node\(\) -fnesc-gcc=gcc-4.8 -Wall -Wshadow -Wnesc-all -target=micaz -fnesc-cfile=simbuild/micaz/app.c -board=micasb -DDEFINED_TOS_AM_GROUP=0x22 -finline-limit=100000 -DIDENT_APPNAME=\"RadioCountToLed\" -DIDENT_USERNAME=\"root\" -DIDENT_HOSTNAME=\"user-virtual-ma\" -DIDENT_USERHASH=0x0859c1faL -DIDENT_TIMESTAMP=0x64608749L -DIDENT_UIDHASH=0x140deaeeL -Wno-nesc-data-race RadioCountToLedsAppC.nc   -fnesc-dump=components -fnesc-dump=variables -fnesc-dump=constants -fnesc-dump=typedefs -fnesc-dump=interfacedefs -fnesc-dump=tags -fnesc-dumpfile=app.xml
In file included from /usr/include/stdlib.h:55,
                 from /opt/tinyos-2.1.2/tos/lib/tossim/tos.h:58:
/usr/include/x86_64-linux-gnu/bits/floatn.h:75: syntax error before `float'
/usr/include/x86_64-linux-gnu/bits/floatn.h:87: syntax error before `_Float128'
make: *** [/opt/tinyos-2.1.2/support/make/sim.extra:69:sim-exe] 错误 1

查阅源代码floatn.h报错的部分如下图:

img

这就产生了矛盾,如果使用gcc7以上的版本,就会出现第一个错误,如果把gcc降级至4.8,就会出现第二个错误。
应该如何解决?

最终解决方案:重新安装ubuntu14.04.6,之前的ubuntu版本太新了,环境不兼容。

以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

这个问题是由于TOSSIM工具与gcc/g++版本不兼容导致的,解决方法是安装一个旧版的gcc/g++,然后在编译TOSSIM工具时指定使用这个旧版的gcc/g++。以下是具体的解决步骤:

  1. 安装旧版gcc/g++。可以使用以下命令安装gcc/g++ 4.6:

    sudo apt-get install gcc-4.6 g++-4.6
    
  2. 设置系统默认的gcc/g++版本为4.6。可以使用以下命令:

    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 100
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 100
    

    然后使用以下命令选择默认版本:

    sudo update-alternatives --config gcc
    sudo update-alternatives --config g++
    
  3. 编译TOSSIM工具。在编译TOSSIM工具时,需要指定使用旧版的gcc/g++。可以使用以下命令:

    make micaz sim EXTRA_CFLAGS=-DCC2420_NO_ACKNOWLEDGEMENTS EXTRA_CXXFLAGS=-DCC2420_NO_ACKNOWLEDGEMENTS CC=gcc-4.6 CXX=g++-4.6
    

    注意,如果你使用的是其它平台,需要将“micaz”替换为你所使用的平台。

  4. 测试TOSSIM工具。在Python中导入TOSSIM时,需要将当前目录加入PYTHONPATH,可以使用以下命令:

    export PYTHONPATH=$PYTHONPATH:/path/to/tinyos-2.1.2/support/sdk/python
    

    然后在Python中输入以下命令进行测试:

    from TOSSIM import *
    

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先说明一下,第一个错误可能与版本问题有关,建议您在尝试之前先检查一下系统的gcc版本。

第二个错误是由于在较新版本的GCC中包含了对浮点类型的头文件更改,导致旧版本的文件编译失败。解决这个问题的方法有两个:

1.将TOSSIM的源代码更新到新版本。您可以在TinyOS的GitHub仓库上找到TOSSIM的最新版本,如果代码已经更新,那么问题可能已经得到解决。

2.在旧版本的GCC中手动更改floatn.h文件以使其能够与TOSSIM正常工作。具体要更改的代码如下:

#if __GNUC_PREREQ (8, 0)
...
#else
...
#endif

应该将这段代码更改为:

#if __GNUC_PREREQ (8, 0)
...
#else
  __extension__ typedef union
  {
    __float128 __f128;
    struct
    {
      __extension__ typedef uint128_t __uint128_t __attribute__((mode(TI)));
      __uint128_t __l;
    } __s;
  } _Float128;
#endif

这将定义一个_Float128结构体,该结构体代表了一个__float128变量。在这方面是否有其他的更简便,更切实可行的解决方案,我无法确定。跨越多个版本的兼容性问题是一个普遍存在的挑战。
如果我的回答解决了您的问题,请采纳!

TinyOS安装完成后使用TIOSSIM仿真的注意事项
可以借鉴下
https://blog.csdn.net/zhaojq1995/article/details/72626832