簡體   English   中英

在 tensorflow-gpu>=1.15 中使用用戶運算符時未定義的符號

[英]Undefined symbols when using user operator in tensorflow-gpu>=1.15

大家。 我寫了一些用戶操作符來擴展 tensorflow 並嘗試使用 CMake 將代碼編譯到不同的共享庫以適應不同版本的 tensorflow。

它適用於 tensorflow-gpu<=1.14,但不適用於 1.15 和 2.0。 加載庫時出現以下錯誤。

tensorflow.python.framework.errors_impl.NotFoundError: build/lib/libtensorflow_ctext.so: undefined symbol: _ZN10tensorflow12OpDefBuilder4AttrENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

我在 1.14 版本和 2.0 版本上嘗試了nm build/lib/libtensorflow_ctext.so ,兩個共享庫的中間都有這個未定義的符號。

U _ZN10tensorflow12OpDefBuilder4AttrENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

程序似乎要在鏈接的 Tensorflow 框架庫 libtensorflow_framework.so 中找到這個符號。 我在 libtensorflow_framework.so.2 中搜索了類似的符號並找到了其中的幾個。

0000000000cacc50 T _ZN10tensorflow12OpDefBuilder10DeprecatedEiSs
0000000000cace00 T _ZN10tensorflow12OpDefBuilder10SetShapeFnESt8functionIFNS_6StatusEPNS_15shape_inference16InferenceContextEEE
0000000000cacb20 T _ZN10tensorflow12OpDefBuilder13ControlOutputESs
0000000000cac980 T _ZN10tensorflow12OpDefBuilder13SetIsStatefulEv
0000000000cac970 T _ZN10tensorflow12OpDefBuilder14SetIsAggregateEv
0000000000cac960 T _ZN10tensorflow12OpDefBuilder16SetIsCommutativeEv
0000000000cac990 T _ZN10tensorflow12OpDefBuilder27SetAllowsUninitializedInputEv
0000000000cacb50 T _ZN10tensorflow12OpDefBuilder3DocESs
0000000000caca90 T _ZN10tensorflow12OpDefBuilder4AttrESs
0000000000cacac0 T _ZN10tensorflow12OpDefBuilder5InputESs
0000000000cacaf0 T _ZN10tensorflow12OpDefBuilder6OutputESs
0000000000cac830 T _ZN10tensorflow12OpDefBuilderC1ESs
0000000000cac830 T _ZN10tensorflow12OpDefBuilderC2ESs
0000000000c702d0 W _ZN10tensorflow12OpDefBuilderD1Ev
0000000000c702d0 W _ZN10tensorflow12OpDefBuilderD2Ev

符號_ZN10tensorflow12OpDefBuilder4AttrESs看起來非常相似,但在最后幾個字母中有所不同。 我真的不知道那些“ES”和“ENSt7”代表什么。

非常感謝有關我如何調試它的提示。 這是構建我的共享庫的命令(由 cmake 生成)

g++ -fPIC   -shared -Wl,-soname,libtensorflow_ctext.so -o lib/libtensorflow_ctext.so src/CMakeFiles/bp_par_2d.dir/bp_par_2d.cc.o src/CMakeFiles/bp_par_2d_sv.dir/bp_par_2d_sv.cc.o src/CMakeFiles/fp_par_2d.dir/fp_par_2d.cc.o src/CMakeFiles/filter.dir/filter.cc.o cuda/CMakeFiles/bp_par_2d_cu.dir/bp_par_2d.cu.o cuda/CMakeFiles/bp_par_2d_sv_cu.dir/bp_par_2d_sv.cu.o cuda/CMakeFiles/fp_par_2d_cu.dir/fp_par_2d.cu.o cuda/CMakeFiles/filter_cu.dir/filter.cu.o tensorflow/CMakeFiles/bp_par_2d_ops.dir/bp_par_2d_ops.cu.o tensorflow/CMakeFiles/bp_par_2d_sv_ops.dir/bp_par_2d_sv_ops.cu.o tensorflow/CMakeFiles/fp_par_2d_ops.dir/fp_par_2d_ops.cu.o tensorflow/CMakeFiles/ramp_filter_ops.dir/ramp_filter_ops.cu.o CMakeFiles/tensorflow_ctext.dir/cmake_device_link.o  -L/usr/lib/x86_64-linux-gnu/stubs -Wl,-rpath,/home/ltl/anaconda3/envs/tf_test/lib/python3.7/site-packages/tensorflow_core /home/ltl/anaconda3/envs/tf_test/lib/python3.7/site-packages/tensorflow_core/libtensorflow_framework.so.2 -lcudadevrt -lcudart_static -lrt -lpthread -ldl 

嗯,這個問題解決了。

我使用nm -C指令查看 .so 文件內部,發現在 Tensorflow>=1.15.0 中,函數定義為

0000000000caca90 T tensorflow::OpDefBuilder::Attr(std::string)

而在 Tensorflow<=1.14.0 中,函數定義為

0000000000c96ed0 T tensorflow::OpDefBuilder::Attr(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)

因此,它們在編譯共享庫時在 _GLIBCXX_USE_CXX11_ABI 上使用不同的設置。

為了保持一致並避免那些未定義的符號問題,我需要為-D_GLIBCXX_USE_CXX11_ABI=1的早期版本定義-D_GLIBCXX_USE_CXX11_ABI=1並為更高版本定義-D_GLIBCXX_USE_CXX11_ABI=0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM