Mmm... so it's not your code (better, for you).
Given that we moved away from waf, and the support for older releases (and 3.30 is *very* old) is practically non-existent... it's a shoot in the dark. It's not that we don't want - 3.30 doesn't even compile on my computer - not anymore.
Said that, try to compile it as a static library (./waf configure –enable-static if I remember right). The problem, however, is that a module working at IP level shouldn't depend on a specific NetDevice, so adding a dependency on WiFi to AODV is horribly wrong - by design - and this should tell you something about the overall quality of the software (and proposed algorithm) you're dealing with. No offence, but it looks to me that the original author took some questionable shortcuts. Some *very* questionable shortcuts.
My personal suggestion (if you want to improve the model) is to check why there's a dependency on WiFi (or on other modules). An example... is AODV really needing WiFi (err... no). According to the PDF in the repo, the only place where WiFi is used in AODV is here:
Ptr<WifiNetDevice> wifiNetDevice = DynamicCast<WifiNetDevice> (device);
Ptr<Node> node = wifiNetDevice->GetNode();
Ptr<Trust> trust = node->GetObject<ns3::Trust> ();
Now, this is... unnecessary. You can simply write:
Ptr<Trust> trust = GetObject<ns3::Trust> ();
because... aggregation magic (AODV is aggregated to the node, and aggregation is mutual, so if Trust is aggregated to the node, it's also aggregated to AODV).
A less "magic" way is:
device->GetNode()->GetObject<ns3::Trust> ();
because GetNode() is a virtual function of NetDevice, there's no need whatsoever to have to cast it to a specific NetDevice type. Virtual functions are virtual for a reason.