Связать статическую библиотеку с другой статической библиотекой - PullRequest
2 голосов
/ 20 марта 2012

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

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

Согласно этому сообщению Как объединить две статические библиотеки "ar" в одну Должна быть возможность объединения архивов в одну.

Это обычный вызов CheckLibWithHeaderздесь недостаточно?

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

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

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

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

Или вместо относительного dir '#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.
1 голос
/ 14 января 2017

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

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)

Что-то похожее на вышеприведенное должно работать.

...