2012-03-20 3 views
1

Я пытаюсь связать статическую библиотеку [1] в другую статическую библиотеку [2] с помощью scons.Связать статическую библиотеку с другой статической библиотекой

К сожалению, испущенный вызов «ar» никогда не содержит пути к библиотеке [1].

В соответствии с этим сообщением How to merge two "ar" static libraries into one должно быть возможно объединиться с архивами в один.

Обычный вызов CheckLibWithHeader здесь не является достаточным?

С наилучшими пожеланиями

+0

Вы не можете связать статическую библиотеку с другой статической библиотекой. Вы можете включить содержимое статической библиотеки в другую статическую библиотеку. (Предполагая не-окна). Вы даже привязаны к примеру команд, необходимых для этого. – bdbaddog

ответ

3

Вы пытались указать полный путь к библиотеке [1], обращаясь к нему с SCons ар команды?

Brady

Добавление больше информации в мой оригинальный ответ: Поскольку у вас нету вывесили ваши Scons сценарии, я буду считать его что-то вроде того, я представляю ниже:

Обычно переменная LIBPATH строительство используется для указания путей к библиотекам, но, похоже, работает только с конструктором Program() и не используется с командой ar. Затем необходимо указать полный путь для рассматриваемой библиотеки. Предполагая, что у меня есть следующая структура каталогов:

# tree . 
. 
|-- SConstruct 
|-- fileA.cc 
|-- fileA.o 
|-- libB 
| `-- libmoduleB.a 
|-- libmoduleA.a 
`-- libmoduleC.a 

Вот это SConscript, который показывает, как сделать так:

env = Environment() 
env.Library(target = 'moduleA', source = 'fileA.cc') 
env.Library(target = 'moduleC', source = ['libmoduleA.a', '#libB/libmoduleB.a']) 

Или вместо относительной директории «#libB», можно указать абсолютный путь , (Символ «#» в пути означает его относительно SConscript)

И, чтобы сделать его портативным, вы должны указать библиотеку moduleB (и ModuleA), как это:

libBname = "%smoduleB%s" % (env['LIBPREFIX'], env['LIBSUFFIX']) 
libB = os.path.join(pathToLibB, libBname) 

Вот результат :

# scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o fileA.o -c fileA.cc 
ar rc libmoduleA.a fileA.o 
ranlib libmoduleA.a 
ar rc libmoduleC.a libmoduleA.a libB/libmoduleB.a 
ranlib libmoduleC.a 
scons: done building targets. 
+0

Привет, Brady, я связал env.Append (LINKFLAGS = ['- lLibrary1']), а также .CheckLibWithHeader (...), но команда ar никогда не изменяется. Большое спасибо, Томас. – Thomas

+0

Не могли бы вы показать сценарии Сконцов. – Brady

+0

Спасибо за очень подробный ответ - все получилось! – Thomas

0

вы должны были бы создать конструктор, который запускает команды в другой SO question вы связаны.

ar -x libabc.a 
ar -x libxyz.a 
ar -c libaz.a *.o 

Хотя вы, возможно, потребуется сканер, чтобы найти файлы, содержащиеся в каждой статической библиотеки (ar t libabc.a), а затем использовать выход из этого в качестве входных данных для нормальной статической библиотеки строитель.

ofiles = env.unArchive('libabc.a') 
ofiles.extend(env.unArchive('libxyz.a')) 

env.StaticLibrary('az',ofiles) 

Нечто подобное должно работать.

Смежные вопросы