У меня около 26 статических библиотек, таких как liba.a, libb.a, libc.a, ..., libz.a
.Здесь есть два улова:
1) циклические зависимости, например, между liba.a
и libb.a
;
2) некоторые lib*.a
имеют статический глобальный регистрационный код, на который нет ссылок, но должныНЕ быть раздетым
Благодаря stackoverflow мне удалось решить две вышеупомянутые проблемы с опцией ld -Wl,--whole-archive -la -lb -lc -ld -le ...(omitted)... -lz -Wl,--no-whole-archive -lpthread -lm -ldl -lrt -fopenmp
, , и исполняемый двоичный файл работает! Это также объясняется в вопросе компоновщика ld:Опция --whole-archive
Теперь мне нужно объединить все 26 lib*.a
в одну статическую библиотеку liball.a
.Кроме того, благодаря stackoverflow, приведенный ниже 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
команда link с -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 получен по наибольшему голосованиюОтвет по вышеуказанной ссылке, и он не работает.Пожалуйста, удалите дубликат отметки, чтобы люди могли внести свой вклад.Благодаря.