C++ 与NS3模块链接,并循环依赖于其他库
我正在尝试构建依赖于某个静态库的定制NS3模块。此静态库依赖于NS3模块 平台:Ubuntu 16.04 x64 工具链:GCC 5.4.0 我将把我的自定义NS3模块称为mymodule 我将mymodule所依赖的库称为mylib 我将把与mymodule和mylib链接的程序称为myprogC++ 与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是相互依赖
wscript
用于mymodule:
当我执行/waf build
时失败:LD无法链接myprog,因为mylib有未解析的符号。这种失败实际上是意料之中的,因为mylib和mymodule是相互依赖的,应该以非标准方式链接
解决办法:
-Wl,--start group
-lns3.26-mymodule-debug-lmylib-Wl,--端组
它链接非常好,工作正常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']