使用qt配置自己編譯的tensorflow,在.pro
文件下添加如下配置:
INCLUDEPATH += /usr/local/opencv3/include \
/usr/local/include \
/home/zy/.cache/bazel/_bazel_zy/69673882bdf22f44b89ee446a9525e4a/external/eigen_archive/Eigen \ #Eigen library;
/home/zy/.cache/bazel/_bazel_zy/69673882bdf22f44b89ee446a9525e4a/external/eigen_archive \
/home/zy/.cache/bazel/_bazel_zy/69673882bdf22f44b89ee446a9525e4a/external/nsync/public \
/home/zy/Downloads/tensorflow-1.4.0/bazel-tensorflow-1.4.0 \
/home/zy/Downloads/tensorflow-1.4.0/bazel-genfiles
LIBS += -L/home/zy/Downloads/tensorflow-1.4.0/bazel-bin/tensorflow \
-L/usr/local/opencv3/lib/ \
-L/usr/local/lib \
/usr/local/lib/libprotobuf.a \
/home/zy/Downloads/tensorflow-1.4.0/bazel-bin/tensorflow/libtensorflow_cc.so \
/home/zy/Downloads/tensorflow-1.4.0/bazel-bin/tensorflow/libtensorflow_framework.so \
/usr/local/opencv3/lib/libopencv_core.so \
/usr/local/opencv3/lib/libopencv_highgui.so \
/usr/local/opencv3/lib/libopencv_imgproc.so \
/usr/local/opencv3/lib/libopencv_imgcodecs.so
運行包含tensorflow頭文件的程序,出現如下錯誤:
[libprotobuf FATAL external/protobuf_archive/src/google/protobuf/stubs/common.cc:79] This program was compiled against version 2.6.1 of the Protocal Buffer runtime library, which is not compatible with the installed version(3.4.0). Contact the program author for an update. If you compiled the program yourself, make sure that your headers are from the same version of Protocal Buffers as your link-time library. (Version verification failed in "/build/mir-08_xaj/mir-0.26.3+16.044.20170605/obj-x86_64-linux-gnu/src/protobuf/mir_protobuf.pb.cc".)terminate called after throwing an instance of 'google::protobuf::FatalException' what(): This program was compiled against version 2.6.1 of the Protocal Buffer runtime library, which is not compatible with the installed version (3.4.0). Contact the program author for an update. If you compiled the program yourself, make sure that your headers are from the same version of the Protocal Buffers as your link-time library. (Version verification failed in "/build/mir-08_xaj/mir-0.26.3+16.04.20170605/obj-x86_64-linux-gun/src/protobuf/mir_protobuf.pb.cc".)
問題分析
系統的protoc位置在/usr/local/bin
, 使用protoc --version
輸出的版本號為:libprotoc 3.4.0
.
另有一個protoc在/usr/bin/
,使用protoc --version
輸出的版本號為:libprotoc 2.6.1
.
在/usr/local/bin位置將protoc重命名未protoc.3.4.0,然后建立指向/usr/bin的protoc的軟連接(保證系統中protoc都使用2.6.1的版本),重新運行程序,還是報以上錯誤。分析估計是:tensorflow編譯動態鏈接庫的過程中使用了3.4.0版本的protoc,但實際上tensorflow要求使用2.6.1版本,所以不能用。
解決
重新編譯tensorflow動態鏈接庫,使用命令:
$./configure
$bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda tensorflow:libtensorflow_cc.so
推測:bazel編譯tensorflow過程中使用了protoc,上面的步驟保證了使用到的protoc是和tensorflow工程要求的版本一致(一杯茶,慢慢等待結果……)
測試結果
在tensorflow的源碼目錄下,獲得bazel-bin/tensorflow/libtensorflow_cc.so文件,
遇到錯誤: error: unsupported/Eigen/CXX11/Tensor: No such file or directory
;安裝eigen3,並將安裝目錄放置到工程鏈接庫文件INCLUDEPATH += /usr/include/eigen3 \
;
error: nsync_cv.h: No such file or directory
添加~/.cache
目錄下的動態鏈接庫。
還是不行,郁悶,報上面那個錯誤。。。
重來
發現問題:刪除工程中對opencv的引入,則可以正常運行。推測是opencv對protoc 2.6.1有依賴,看https://stackoverflow.com/questions/41964212/conflict-protobuf-version-when-using-opencv-and-tensorflow-c 中也說,因為安裝opencv時使用GTK3,而GTK3依賴於protobuf 2.6.1,所以,在同一個cpp里面同時使用opencv和tensorflow會報protoc版本錯誤的問題(可是我已經把系統的protoc裝成2.6.1了啊???難道是tensorflow自己去下載使用了protoc 3.4.0???而且,其實我沒有找到GTK3會依賴protoc2.6.1的證據。,我已經非常混亂了。。。)
重裝opencv
打開QT選項,希望它不會和GTK 3、protoc2.6.1扯上關系。。。
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3 \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D WITH_V4L=ON \
-D WITH_QT=ON \
-D WITH_GTK=ON \
-D WITH_OPENGL=ON \
-D BUILD_EXAMPLES=OFF ..
編譯過程非常漫長,特別是在最后97%的時候,'Built target opencv_perf_stitching'大約會停止15分鍾,頭一次我編譯的時候以為中間出錯了,一看cpu占用99%,於是就ctrl+c了,提示:一定要耐心,BE PATIENT!
重新安裝opencv后,在工程中同時引入opencv和tensorflow成功,證明了我之前的推斷是正確的,給自己點個贊!