2017-02-22 16 views
2

我目前正試圖在我的程序中使用Tensorflow的共享庫與另一個立體視覺庫,但是當我同時使用兩個立體視覺庫時出現分割錯誤。使用與另一個庫的張量流時的分割錯誤,都鏈接到eigen3

我爲tensorflow創建了一個共享庫「libtensorflow_cc.so」,這樣我就可以在其他使用CMake的程序中使用TensorFlow。我可以使用它編譯一個簡單的tensorflow程序並運行它:神經網絡工作正常,我複製了我用Python獲得的結果。 TensorFlow(r0.12)用Protobuf(3.1.0)和Eigen(v3)編譯。

我可以用專用的立體視覺共享庫編譯我的立體視覺程序,並在沒有TensorFlow的情況下運行它。

然而,當我包括Tenserflow這樣的:

#include "tensorflow/core/lib/core/refcount.h" 
在前面的立體視覺方案

,不使用其他任何東西從TensorFlow,我可以重新編譯,但我會在運行時的分割錯誤。

立體視覺專用共享庫包括eigen3。 TensorFlow有它自己的版本的eigen3,它使用原始eigen3的一些功能。

因此,我認爲TensorFlow包含的定義替換了包含eigen3時使用的原始定義。當專用立體視覺庫使用TensorFlow的eigen3定義時,它會崩潰。我跑Valgrind的的程序,看看這個:

==10038== Process terminating with default action of signal 11 (SIGSEGV) 
==10038== General Protection Fault 
==10038== at 0x7E66E2D: Eigen::ColPivHouseholderQR >::computeInPlace() (in /home/hammouche/.cache/bazel/_bazel_hammouche/0355a6c384eef63f75e9b7278f4fc05b/execroot/tensorflow/bazel-out/local_linux-opt/bin/tensorflow/libtensorflow_cc.so) 
==10038== by 0x1108C490: Eigen::LevenbergMarquardt, double>::minimizeOneStep(Eigen::Matrix&) (in /usr/local/zed/lib/libsl_calibration.so) 

功能Eigen::LevenbergMarquardt在立體視覺庫(/usr/local/zed/lib/libsl_calibration.so)使用來自TensorFlow的本徵(/home/hammouche/.cache/bazel/_bazel_hammouche/0355a6c384eef63f75e9b7278f4fc05b/execroot/tensorflow/bazel-out/local_linux-opt/bin/tensorflow/libtensorflow_cc.so)的定義,而應該從安裝在徵使用的定義電腦(/usr/local/include/eigen3)。

我該如何解決這個問題?非常感謝您的幫助

回答

2

這聽起來像你的cmake程序導出Eigen符號,而它不應該。

建築與bazel確保這些符號不會使用exported_symbols_list指令出口。我不確定cmake中的等效命令是什麼。請參閱Limit the exported symbols from _pywrap_tensorflow.so以獲取更多信息

0

Tensorflow使用自己的eigen3副本,該副本可能與您在項目中需要的副本不同。

相關問題