【问题标题】:C++: undefined reference to std::thread while compiling opencv and tensorflow with g++C ++:使用g ++编译opencv和tensorflow时对std :: thread的未定义引用
【发布时间】:2017-07-27 10:15:59
【问题描述】:

我想使用 opencv 对将馈送到张量流模型的图像执行一些预处理。 预处理部分读入.png 文件,代码作为独立程序工作,但我想在运行张量流模型的程序中使用它,所以我生成了一个目标文件,如下所示。预处理程序可以独立运行。

g++ -std=c++11 preProcess.cpp -I/home/dpk/anaconda2/include/libpng16 -I/usr/local/include/opencv2 -L/home/dpk/anaconda2/lib -lpng16 -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -c

tensorflow程序Inference.cc编译如下

g++ -std=c++11 preProcess.o Inference.cc -I/home/dpk/anaconda2/include/libpng16 -I/usr/local/include/opencv -I/usr/local/include/opencv2 -I/usr/local/include/tf -I/usr/local/include/eigen3 -I/usr/local/include/tf/bazel-genfiles -g -Wall -D_DEBUG -Wshadow -Wno-sign-compare -w  -L/usr/local/lib/libtensorflow_cc -L/home/dpk/anaconda2/lib -lpng16 -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_flann -lopencv_core `pkg-config --cflags --libs protobuf` -ltensorflow_cc -o inference

这会引发以下错误

/usr/local/lib/libtensorflow_cc.so: undefined reference to `std::thread::_State::~_State()@GLIBCXX_3.4.22'
/usr/local/lib/libtensorflow_cc.so: undefined reference to `std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)())@GLIBCXX_3.4.22'
/usr/local/lib/libtensorflow_cc.so: undefined reference to `typeinfo for std::thread::_State@GLIBCXX_3.4.22'

这个错误似乎是链接-L/home/dpk/anaconda2/lib引起的,因为当我不链接那个文件夹时编译很顺利,但是程序无法读取.png文件。因此,该文件夹似乎是处理.png 所必需的。

我需要我的程序来读取 .png 文件以及运行 tensorflow 模型。我怎样才能让它们都工作?

【问题讨论】:

  • 它似乎是 C++11 标准的一部分。尝试使用标志-std=c++11
  • @bracco23 试过了,抛出同样的错误。我将编辑我的问题以包含该标志
  • 可能看起来很傻,但请检查您的文件中是否有标题#include &lt;thread&gt;
  • @TheApache 感谢您的建议,这也没有帮助,得到了同样的错误。
  • 这发生在我身上是因为我的 $PATH 指向的是旧版本的 gcc。 which gcc 告诉我。

标签: c++ opencv tensorflow g++ libpng


【解决方案1】:

Tensorflow 是使用 gcc 6 构建的,因为有一个链接器错误会阻止使用 gcc 5 成功编译。您必须使用 gcc 6 构建和链接您的程序以避免此链接器错误。

【讨论】: