C++ 与NS3模块链接,并循环依赖于其他库

C++ 与NS3模块链接,并循环依赖于其他库,c++,static-libraries,circular-dependency,waf,ns-3,C++,Static Libraries,Circular Dependency,Waf,Ns 3,我正在尝试构建依赖于某个静态库的定制NS3模块。此静态库依赖于NS3模块 平台:Ubuntu 16.04 x64 工具链:GCC 5.4.0 我将把我的自定义NS3模块称为mymodule 我将mymodule所依赖的库称为mylib 我将把与mymodule和mylib链接的程序称为myprog wscript用于mymodule: 当我执行/waf build时失败:LD无法链接myprog,因为mylib有未解析的符号。这种失败实际上是意料之中的,因为mylib和mymodule是相互依赖

我正在尝试构建依赖于某个静态库的定制NS3模块。此静态库依赖于NS3模块

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

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

我将mymodule所依赖的库称为mylib

我将把与mymodule和mylib链接的程序称为myprog

wscript
用于mymodule:

当我执行
/waf build
时失败:LD无法链接myprog,因为mylib有未解析的符号。这种失败实际上是意料之中的,因为mylib和mymodule是相互依赖的,应该以非标准方式链接

解决办法:

  • 如果我手工构建myprog并使用
    -Wl,--start group
    -lns3.26-mymodule-debug-lmylib-Wl,--端组
    它链接非常好,工作正常

  • 如果我手动组合两个静态lib(使用
    ar-M
    script),然后运行
    /waf build
    ,它也可以正常工作


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

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

    一种解决方法可能是使用
    程序的
    linkflags
    属性。您应该更喜欢使用
    STLIB_MYLIB
    STLIBPATH_MYLIB
    ,因为MYLIB是静态的。在waf 1.9中,如果LIB顺序正确,可能就足够了


    无论如何,使用-v查看waf生成的命令行可能会有所帮助

    谢谢你的回答。不幸的是,NS3.26使用了waf 1.8。看起来我们通过以下步骤解决了这个问题:1)将
    cxxstlib
    更改为
    cxxshlib
    (…st…->…sh…)它启用了
    STLIB.*
    2)将
    -fPIC
    放入module.cflags和mylib生成文件3)将
    STLIB./mylib
    添加到wscript中
    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']