Связь с модулем NS3 с круговой зависимостью от другой библиотеки

Я пытаюсь создать собственный модуль NS3, который зависит от статической библиотеки. Эта статическая библиотека зависит от модуля NS3.

Платформа: Ubuntu 16.04 x64 Набор инструментов: GCC 5.4.0

Я буду ссылаться на мой пользовательский модуль NS3 как на мой модуль

Я буду ссылаться на библиотеку, от которой зависитмой модуль, как на mylib.

Я буду ссылаться на программу, которая связываетmymodule и mylib как myprog

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']

Когда я делаю./waf buildэто терпит неудачу: LD не может связатьmyprog, потому что у mylib есть неразрешенные символы. Этот сбой действительно ожидается, потому что mylib и mymodule зависят от кода и должны быть связаны нестандартным способом.

обходные:

  1. Если я соберу myprog вручную и использую -Wl,--start-group -lns3.26-mymodule-debug -lmylib -Wl,--end-group он прекрасно связывается и работает как положено.

  2. Если я объединю две статические библиотеки вручную (используя ar -M сценарий), а затем запустить ./waf build это также работает отлично.

Вопрос: как я могу интегрировать один из обходных путей выше в wscript?

1 ответ

Решение

Похоже на известную проблему с порядком включения статических библиотек. Поведение изменилось в waf 1.9 из-за этой проблемы.

Одним из обходных путей может быть использование linkflags атрибут program, Вы должны предпочесть использование STLIB_MYLIB а также STLIBPATH_MYLIB так как mylib статичен В ваф 1.9 с правильным порядком библиотек это может быть достаточно.

В любом случае, используйте -v, чтобы увидеть командную строку, сгенерированную waf, это может помочь!

Другие вопросы по тегам