Связь с модулем 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 зависят от кода и должны быть связаны нестандартным способом.
обходные:
Если я соберу myprog вручную и использую
-Wl,--start-group -lns3.26-mymodule-debug -lmylib -Wl,--end-group
он прекрасно связывается и работает как положено.Если я объединю две статические библиотеки вручную (используя
ar -M
сценарий), а затем запустить./waf build
это также работает отлично.
Вопрос: как я могу интегрировать один из обходных путей выше в wscript
?
1 ответ
Похоже на известную проблему с порядком включения статических библиотек. Поведение изменилось в waf 1.9 из-за этой проблемы.
Одним из обходных путей может быть использование linkflags
атрибут program
, Вы должны предпочесть использование STLIB_MYLIB
а также STLIBPATH_MYLIB
так как mylib статичен В ваф 1.9 с правильным порядком библиотек это может быть достаточно.
В любом случае, используйте -v, чтобы увидеть командную строку, сгенерированную waf, это может помочь!