与循环依赖于其他库的 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
我将使用 mymodule 和 mylib 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 有未解析的符号。这种失败实际上是预料之中的,因为 mylib 和 mymodule 是相互依赖的,应该以非标准方式 linked。
解决方法:
如果我手动构建 myprog 并使用 -Wl,--start-group
-lns3.26-mymodule-debug -lmylib -Wl,--end-group
它 link 完全没问题并且按预期工作。
如果我手动组合两个静态库(使用 ar -M
脚本)然后 运行 ./waf build
它也可以正常工作。
问题: 如何将上述解决方法之一集成到 wscript
?
这看起来像是静态库包含顺序的已知问题。由于此问题,waf 1.9 中的行为已更改。
一种解决方法可能是使用 program
的 linkflags
属性。您应该更喜欢使用 STLIB_MYLIB
和 STLIBPATH_MYLIB
,因为 mylib 是静态的。在 waf 1.9 中,正确的库顺序可能就足够了。
总之,使用-v查看waf生成的命令行,可能会有帮助!
我正在尝试构建依赖于某些静态库的自定义 NS3 模块。这个静态库依赖于 NS3 模块。
平台:Ubuntu 16.04 x64 工具链:GCC 5.4.0
我将我的自定义 NS3 模块称为 mymodule
我将mymodule依赖的库引用为mylib
我将使用 mymodule 和 mylib 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 有未解析的符号。这种失败实际上是预料之中的,因为 mylib 和 mymodule 是相互依赖的,应该以非标准方式 linked。
解决方法:
如果我手动构建 myprog 并使用
-Wl,--start-group -lns3.26-mymodule-debug -lmylib -Wl,--end-group
它 link 完全没问题并且按预期工作。如果我手动组合两个静态库(使用
ar -M
脚本)然后 运行./waf build
它也可以正常工作。
问题: 如何将上述解决方法之一集成到 wscript
?
这看起来像是静态库包含顺序的已知问题。由于此问题,waf 1.9 中的行为已更改。
一种解决方法可能是使用 program
的 linkflags
属性。您应该更喜欢使用 STLIB_MYLIB
和 STLIBPATH_MYLIB
,因为 mylib 是静态的。在 waf 1.9 中,正确的库顺序可能就足够了。
总之,使用-v查看waf生成的命令行,可能会有帮助!