【问题标题】:Linking with NS3 module with circular dependency to other library与具有循环依赖关系的 NS3 模块链接到其他库
【发布时间】:2017-03-29 18:34:26
【问题描述】:

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

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

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

我将 mymodule 所依赖的库称为 mylib

我将把与 mymodulemylib 链接的程序称为 myprog

wscript for 我的模块

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 无法链接 myprog 因为 mylib 有未解析的符号。这种失败实际上是意料之中的,因为 mylibmymodule 是相互依赖的,应该以非标准方式链接。

解决方法:

  1. 如果我手动构建 myprog 并使用 -Wl,--start-group -lns3.26-mymodule-debug -lmylib -Wl,--end-group,它的链接非常好,并且可以按预期工作。

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

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

【问题讨论】:

    标签: c++ static-libraries circular-dependency waf ns-3


    【解决方案1】:

    它看起来像是静态库包含顺序的已知问题。由于这个问题,waf 1.9 中的行为发生了变化。

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

    不管怎样,用-v查看waf生成的命令行,或许有帮助!

    【讨论】:

    • 感谢您的回答。不幸的是 NS3.26 使用 waf 1.8。
    • 看起来我们通过以下步骤解决了这个问题:1) 将cxxstlib 更改为cxxshlib (..st.. -> ..sh..) 它启用STLIB_* 2)将-fPIC 放入module.cflags 和mylib makefile 3) 将STLIB_MYLIB 添加到wscript
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 2014-09-06
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多