Дилемма Libtorch/Pytorch при объединении статической библиотеки в одну библиотеку STATIC

У меня есть около 26 статических библиотек, таких как liba.a, libb.a, libc.a, ..., libz.a, Здесь есть два улова:

1) круговые зависимости между, например, liba.a а также libb.a;

2) некоторые lib*.a имеет статический глобальный регистрационный код, на который нет ссылок, но он НЕ должен быть удален.

Благодаря stackru мне удалось решить две вышеупомянутые проблемы с опцией ld -Wl,--whole-archive -la -lb -lc -ld -le ...(omitted)... -lz -Wl,--no-whole-archive -lpthread -lm -ldl -lrt -fopenmp и исполняемый двоичный файл работает! Это также объясняется в вопросе ld linker: опция --whole-archive

Теперь мне нужно объединить все 26 lib*.a в одну статическую библиотеку liball.a, Кроме того, благодаря stackru, нижеприведенный MRI script.mri успешно производит liball.a через команду ar -M < script.mri

create liball.a
addlib liba.a
addlib libb.a
addlib libc.a
addlib libd.a
... //omitted
addlib libz.a
save
end

Однако здесь возникает проблема при связывании с недавно объединенной статической библиотекой. liball.a:

1) с возможностью -Wl,--whole-archive -lall -Wl,--no-whole-archive -lpthread -lm -ldl -lrt -fopenmp FAILS!! Он генерирует тысячи multiple defined symbols error или же undefined symbols error!!

2) без опции -Wl,--whole-archive, ссылка команда с -lall -lpthread -lm -ldl -lrt -fopenmp успешно создал исполняемый двоичный файл. Тем не менее, двоичный файл не выполняется, жалуясь на ошибку кода регистрации устройства. Я понимаю, что это вызвано тем, что код инициализации процессора удаляется при компоновке. Ниже приведена подробная ошибка

 p INTERNAL ASSERT FAILED at ../c10/core/impl/DeviceGuardImplInterface.h:132, please report a bug to PyTorch. DeviceGuardImpl for cpu is not available (getDeviceGuardImpl at ../c10/core/impl/DeviceGuardImplInterface.h:132)

Этот вопрос также упоминается здесь https://github.com/pytorch/pytorch/issues/14367

Один из способов решить эту проблему - использовать выборочную регистрацию. Может ли кто-нибудь поделиться более подробной информацией об этом?

Этот вопрос НЕ является дубликатом Как объединить две статические библиотеки "ar" в одну? Метод сценария MRI - это ответ с наибольшим количеством голосов по вышеуказанной ссылке, и он не работает. Пожалуйста, удалите дубликат отметки, чтобы люди могли внести свой вклад. Благодарю.

0 ответов

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