与循环依赖于其他库的 NS3 模块链接

Linking with NS3 module with circular dependency to other library

我正在尝试构建依赖于某些静态库的自定义 NS3 模块。这个静态库依赖于 NS3 模块。

平台:Ubuntu 16.04 x64 工具链:GCC 5.4.0

我将我的自定义 NS3 模块称为 mymodule

我将mymodule依赖的库引用为mylib

我将使用 mymodulemylib link 的程序称为 myprog

wscript 对于 mymodule:

def build(bld):
   module = bld.create_ns3_module('mymodule', ['network'])
   module.features = 'c cxx cxxstlib ns3module'
   module.source = [
     'model/mymodule.cc' ]

   # Make a dependency to some other static lib:
   bld.env.INCLUDES_MYLIB = [ "some/include/path" ]
   bld.env.LIB_MYLIB = ['mylib']
   bld.env.LIBPATH_MYLIB = [ "some/path" ]
   module.use.append('MYLIB')

   # Create a program which uses mymodule
   p = bld.create_ns3_program('myprog', ['core', 'mymodule'])
   p.source = 'prog.cpp'

   headers = bld(features='ns3header')
   headers.module = 'mymodule'
   headers.source = ['model/mymodule.h']

当我执行 ./waf build 时它失败了:LD 不能 link myprog 因为 mylib 有未解析的符号。这种失败实际上是预料之中的,因为 mylibmymodule 是相互依赖的,应该以非标准方式 linked。

解决方法:

  1. 如果我手动构建 myprog 并使用 -Wl,--start-group -lns3.26-mymodule-debug -lmylib -Wl,--end-group 它 link 完全没问题并且按预期工作。

  2. 如果我手动组合两个静态库(使用 ar -M 脚本)然后 运行 ./waf build 它也可以正常工作。

问题: 如何将上述解决方法之一集成到 wscript

这看起来像是静态库包含顺序的已知问题。由于此问题,waf 1.9 中的行为已更改。

一种解决方法可能是使用 programlinkflags 属性。您应该更喜欢使用 STLIB_MYLIBSTLIBPATH_MYLIB,因为 mylib 是静态的。在 waf 1.9 中,正确的库顺序可能就足够了。

总之,使用-v查看waf生成的命令行,可能会有帮助!