我已经下载了ns-3.39
,解包并使用
wget https://www.nsnam.org/releases/ns-allinone-3.39.tar.bz2
tar xfj ns-allinone-3.39.tar.bz2
cd ns-allinone-3.39/ns-3.39/
./ns3 configure --disable-examples --disable-tests -d default
./ns3 build
字符串
这个可以用。
当我将#include "ns3/ipv4-header.h"
添加到ns-3.39/src/wifi/model/phy-entity.cc
中,并试图通过在DropPreambleEvent
函数中示例化phy-entity.cc:528
内部的Ipv4Header ipHeader;
来使用该头文件中的Ipv4Header
类时,我得到以下编译错误:
ld: Undefined symbols:
ns3::Ipv4Header::Ipv4Header(), referenced from:
ns3::PhyEntity::DropPreambleEvent(ns3::Ptr<ns3::WifiPpdu const>, ns3::WifiPhyRxfailureReason, ns3::Time) in phy-entity.cc.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
型
我正在一台针对ARM的带有clang
的MacBook M2 Pro上编译。当我在一台带有gcc
的x86_64 Linux服务器上做同样的事情时,它可以工作。
我真的很想让这个工作,这样我就可以在当地工作。我已经投入了一些时间,并发现了以下内容
- 由于未修改的
ns3
模拟器在Mac上编译,因此导致问题的不是ARM平台 ns3
编译了一堆独立的动态库- 我现在最好的猜测是,
Ipv4Header
定义是与PhyEntity
不同的库的一部分,因此它不能调用构造函数 - 可能
gcc
允许动态库中的这种未定义的符号,只要最终的可执行文件链接了所有的符号,就应该没问题,对吗? - 我已经尝试按照this post配置
clang
以允许相同的操作 - 也就是说,我已经将环境变量
OTHER_LDFLAGS
设置为-undefined dynamic_lookup
并重新编译,但没有用
我没办法了。我能试试吗?
1条答案
按热度按时间zkure5ic1#
我让它运行。对于那些在我之后有类似麻烦的人:
我了解到ns 3核心是模块化的(如果你已经知道了,请原谅我,我正在学习),所以wifi模块和互联网模块之间没有直接的联系。模块被编译成动态库,这样你就可以挑选你需要的东西。从软件架构的Angular 来看,这对我来说是完全有意义的。
在我的项目中,我们已经改变了wifi模块的代码(如在最初的帖子中所述),通过包括来自互联网模块的
Ipv4Header
之类的东西。要在使用
clang/arm
编译时实现这一点,您需要通过向src/wifi/CMakeLists.txt
添加1行来显式链接internet库和wifi库,在build_lib(...)
下必须添加字符串
这可能是糟糕的编码风格,因为我们打破了库之间的隔离;我们将接受它用于手头的任务。
我仍然不明白的是为什么Linux系统上的
gcc/x86_64
不需要这个。不知何故,它决定自己链接这个库?如果有人能向我解释这是如何/为什么工作的,我很乐意听到它。