У меня есть программа на 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
Я нахожусь в своем уме и очень расстроен. Кто-нибудь видел это раньше? Есть идеи?