Создание статических библиотек из tensorflow_cc и tensorflow_framework

Насколько я понимаю, используя bazel, я могу создавать только libtensorflow_cc.so и libtensorflow_framework.so. Мне нужно создать статические библиотеки, не зависящие от позиции (-fPIC), потому что позже я свяжу их с собственной динамической библиотекой.

Я нашел этот ответ, в котором предлагается использовать Makefile, включенный в проект. Я успешно использовал его для замены libtensorflow_cc.so, но что я могу сделать, чтобы заменить libtensorflow_framework.so?


person Adam Zahran    schedule 08.01.2018    source источник


Ответы (2)


Не настоящий ответ, но слишком длинный для комментария.

Мне удалось сделать что-то вроде того, что вы упомянули, используя Bazel в Windows. В частности, я хотел создать единую DLL-оболочку с одним или двумя заголовками (ограниченными по функциональности), которую можно было бы легко перемещать. Я напишу резюме того, что я сделал; это довольно запутанно и адаптировано для наших нужд, но, возможно, вы найдете что-то полезное.

  • Я передаю --config=monolithic команде bazel build (помимо любой другой опции, которая вам нужна). Это позволит избежать модульности библиотеки и, таким образом, удалит зависимость от libtensorflow_framework.so (см. инструменты/bazel.rc).
  • Цель, которую я строю, не похожа ни на одну из целей в репозитории TensorFlow. Вместо этого я добавляю очень маленькую программу, которая использует мою оболочку в качестве новой цели Bazel (файл C++ плюс мои заголовки заголовков и файл BUILD). Таким образом, весь TensorFlow должен был быть скомпилирован заранее, чтобы скомпилировать эту окончательную фиктивную программу.
  • Когда я это сделаю, я воспользуюсь тем фактом, что Bazel уже компилирует каждую подцель как статическую библиотеку. Я проверяю файл в каталоге bazel-bin, сгенерированный для моей цели-пустышки с именем, заканчивающимся на .params, — там я нахожу путь ко всем статическим библиотекам, которые использовались для его компиляции.
  • Я копирую все эти промежуточные статические библиотеки куда-то еще. Кроме того, я копирую кучу заголовков, которые мне понадобятся для компиляции моей окончательной оболочки (собственно TensorFlow, но теперь также и Eigen, Protobuf и Nsync). Я поместил все это в область сборки, которую я подготовил ранее.
  • Я использую NMake Makefile для создания собственной библиотеки DLL, используя статические библиотеки, скопированные заголовки и собственную тонкую оболочку.

И это об этом, я думаю. У меня есть уродливый скрипт Bash, который я запускаю на MSYS2, и он все делает за меня. Обычно с каждым новым выпуском мне нужно настроить одну или две вещи (некоторые опции в сценарии configure, некоторые дополнительные заголовки, которые мне нужно скопировать и т. д.), но в конце концов я заставляю это работать. Однако это довольно много возни, поэтому я не обязательно говорю, что вы должны использовать тот же подход (но не стесняйтесь спрашивать подробности о любом шаге, если хотите).

person jdehesa    schedule 08.01.2018

Используя файлы -2.params, упомянутые @jdehesa, и подробный вывод bazel (переключатель -s), вы даже можете создать команду ссылки, чтобы в конечном итоге статически связать эти промежуточные статические библиотеки. Я автоматизировал этот процесс для Windows/Linux/macOS и включил его в vcpkg менеджер пакетов. Чтобы использовать его, просто запустите vcpkg install tensorflow:x64-windows-static. Если вас интересуют исходники, вы найдете их здесь< /а>.

person jgehw    schedule 07.12.2020