Невозможно связать C ++ с помощью tenorflow C ++ API tenorsflow_cc.lib в Windows 10 / Visual C ++ 2017 - неопределенный символ r2.0 - PullRequest
1 голос
/ 01 октября 2019

У меня есть программа на C ++, которую я пытаюсь использовать с API-интерфейсом tenorflow C ++. У меня это работает нормально на Linux. Но я не могу заставить эту глупую ссылку связать в Windows. Я использую ветку r2.0 тензорного потока. Я строю тензор потока из источника с помощью Visual C ++ 2017 (v14.16.27023). Это заняло какое-то время, но я наконец-то нашел базу для создания tennsflow_cc.dll и tensorflow_cc.lib. Связывание моей программы с tenorflow_cc.lib изначально дало 3 неопределенных символа тензорного потока

?_TensorShapeProto_default_instance_@tensorflow@@3VTensorShapeProtoDefaultTypeInternal@1@A
??0SessionOptions@tensorflow@@QEAA@XZ
?LoadSavedModel@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@AEBVRunOptions@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$unordered_set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@6@QEAUSavedModelBundle@1@@Z

Я прочитал несколько отчетов об ошибках в github и обнаружил, что существует сложный метод, используемый для экспорта подмножества глобальных символов в .libфайл, который включает в себя программу на python tenorflow / tools / def_file_filter / def_file_filter.py.tpl, и кто-то показал, как добавить в нее дополнительные символы для добавления в экспортируемый набор. Я пошел дальше и сделал это:

diff --git a/tensorflow/tools/def_file_filter/def_file_filter.py.tpl ...
@@ -154,6 +154,9 @@ def main():
       else:
         def_fp.write("\t" + decorated + " DATA\n")
       taken.add(decorated)
+    def_fp.write("\t??0SessionOptions@tensorflow@@QEAA@XZ\n")
+    def_fp.write("\t?_TensorShapeProto_default_instance_@tensorflow@@3VTensorShapeProtoDefaultTypeInternal@1@A DATA\n")
+    def_fp.write("\t?LoadSavedModel@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@AEBVRunOptions@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV?$unordered_set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$hash@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@U?$equal_to@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@6@QEAUSavedModelBundle@1@@Z\n")
     def_fp.close()

   exit_code = proc.wait()

Затем я перебазировал tenorflow_cc.lib, и он исправил ДВА из ТРИ. Затем я обнаружил, что тот, который оставался неопределенным по ссылке, на самом деле уже был экспортирован:

?_TensorShapeProto_default_instance_@tensorflow@@3VTensorShapeProtoDefaultTypeInternal@1@A

Так что я фактически удалил его из своих изменений в def_file_filter.py.tpl. Этот конкретный символ определен в файле, сгенерированном из файла .proto в bazel-out / x64_windows-opt / bin / tenorflow / core / framework / tensor_shape.pb.cc. Это экземпляр класса глобальной области видимости:

static void InitDefaultsscc_info_TensorShapeProto_tensorflow_2fcore_2fframework_2ftensor_5fshape_2eproto() {
  GOOGLE_PROTOBUF_VERIFY_VERSION;

  {
    void* ptr = &::tensorflow::_TensorShapeProto_default_instance_;
    new (ptr) ::tensorflow::TensorShapeProto();
    ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr);
  }
  ::tensorflow::TensorShapeProto::InitAsDefaultInstance();
}

Я просмотрел символы в tenorflow_cc.lib и нашел запись, связанную с этим символом:

tensorflow_cc.dll:
0000000000000000 I .idata$4
0000000000000000 I .idata$5
0000000000000000 I .idata$6
                 U __IMPORT_DESCRIPTOR_tensorflow_cc
0000000000000000 I __imp_?_TensorShapeProto_default_instance_@tensorflow@@3VTensorShapeProtoDefaultTypeInternal@1@A

Я не уверен, чтоэто правильно или нет. Предположительно нет, так как я все еще получаю:

link tfseg.dll .wsl.obj/plugin.obj .wsl.obj/segTask.obj .wsl.obj/tfseg....
   Creating library C:/root/ispace/plugins/tfseg/bin_release/tfseg.lib and object C:/root/ispace/plugins/tfseg/bin_release/tfseg.exp
tfseg.obj : error LNK2001: unresolved external symbol "class tensorflow::TensorShapeProtoDefaultTypeInternal tensorflow::_TensorShapeProto_default_instance_" (?_TensorShapeProto_default_instance_@tensorflow@@3VTensorShapeProtoDefaultTypeInternal@1@A)
C:/root/ispace/plugins/tfseg/bin_release/tfseg.dll : fatal error LNK1120: 1 unresolved externals

Я нахожусь в своем уме и очень расстроен. Кто-нибудь видел это раньше? Есть идеи?


1 Ответ

0 голосов
/ 01 октября 2019

Мне удалось обойти эту ошибку ссылки. Это уродливо, и я все еще чувствую, что что-то не так с построением тензорного потока на окнах. Но если кто-то столкнется с той же проблемой, это то, что я сделал. Я добавил .o файл, который содержит недостающий символ (tenor_shape.pb.o), прямо в мою строку ссылки, и это привело к появлению еще нескольких неразрешенных символов, все из google protobuf. Затем я отправился на поиски прототипа файлов ".a" и добавил их. Чудесным образом это сработало. Вот сводка новой строки ссылки:

cl.exe -MD ... plugin.obj .wsl.obj/segTask.obj .wsl.obj/tfseg.obj /link /dll ... c:/root/tensorflow/bazel-out/x64_windows-opt/bin/tensorflow/core/_objs/protos_all_proto_cc_impl/tensor_shape.pb.o c:/root/tensorflow/bazel-out/x64_windows-opt/bin/external/com_google_protobuf/libprotobuf.a c:/root/tensorflow/bazel-out/x64_windows-opt/bin/external/com_google_protobuf/libprotobuf_lite.a c:/root/tensorflow/bazel-bin/tensorflow/tensorflow_cc.lib 

Мне удалось успешно использовать tenorflow в этой точке, и мне просто нужно было использовать tenorflow_cc.dll в моем пути поиска LoadLibrary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...