【发布时间】:2017-10-10 00:54:34
【问题描述】:
我可以在独立的 C++ 程序中使用静态 C++ tensorflow 库,但不能在依赖于 C++ tensorflow 库的qmake 项目中使用静态库。我正在使用-Wl,--allow-multiple-definition, -Wl,--whole-archive 的链接器选项,但没有效果。
我能够构建独立程序以及 qmake 项目,但 qmake 目标引发运行时错误。
我使用以下命令编译我的独立程序 (test.cpp):
g++ -std=c++11 -Wl,--whole-archive -Wl,--allow-multiple-definition \
-Wl,-O1 -Wl,-rpath,'$ORIGIN/lib' -Iinclude -Llib infer.o test.cpp \
-ltensorflow_cc -ltensorflow_framework -o exec
在我的 qmake 项目中,目标(test 具有多个依赖项)是使用以下内容构建的:
g++ -m64 -Wl,--allow-multiple-definition -Wl,--whole-archive -Wl,
-O1 -Wl,-rpath,'$ORIGIN/lib' $(OBJECTS)/*.o \
-L../lib/debugL../quackleio/lib/debug -L../lib/release \
-L../quackleio/lib/release -L/usr/lib/86_64-linux-gnu -lquackleio -lquackle \
-L../'$ORIGIN/lib' -ltensorflow_framework -ltensorflow_cc -lQtxGui -lQtCore \
-lpthread -o test
这两个都成功编译,没有任何错误。但是,独立的 C++ 程序运行时没有任何错误,而 qmake 抛出以下 错误:
E tensorflow/core/common_runtime/session.cc:69] Not found: No session factory registered for the given session options: {target: "" config: } Registered factories are {}.
F inference/infer.cpp:16] Non-OK-status: NewSession(opts, &session) status: Not found: No session factory registered for the given session options: {target: "" config: } Regisstered factories are {}.
Aborted (core dumped)
在深入挖掘时,在test 上执行命令 ldd 会给出输出(简化,仅显示相关库):
ldd ./test
linux-vdso.so.1 => (0x00007ffda65de000)
libtensorflow_framework.so => /home/rishabh/quackle/inference/lib/libtensorflow_framework.so (0x00007f85d34fb000)
在独立 C++ 程序 (exec) 的可执行文件上运行相同命令时,我得到输出(再次只显示相关库):
ldd ./exec
linux-vdso.so.1 => (0x00007ffd8e09e000)
libtensorflow_cc.so => /home/rishabh/quackle/rishabh_code/inference/./lib/libtensorflow_cc.so (0x00007f8e45873000)
libtensorflow_framework.so => /home/rishabh/quackle/rishabh_code/inference/./lib/libtensorflow_framework.so (0x00007f8e44cbb000)
从这些输出中,可以观察到 libtensorflow_cc.so 没有显示为测试可执行文件的依赖项,而它是 exec 文件的依赖项。但是,它们都使用相同的类infer.h 作为它们的依赖项(qmake 目标间接依赖于infer.h,即它包括使用infer.h 中定义的类的头文件,而独立的C++ 程序包括infer.h 作为直接依赖)。
文件infer.h的代码如下:
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/graph/default_device.h"
#include "tensorflow/core/platform/env.h"
using namespace tensorflow;
class NNInference
{
private:
std::string graph_definition;
Session* session;
std::vector<Tensor> outputs;
Tensor input_tensor;
public:
NNInference(const string &, int);
~NNInference();
float getOutput(std::vector<float> &);
};
有人可以帮我解决这里可能出现的问题吗?如何在 qmake 项目中成功使用libtensorflow_cc.so?提前致谢。
【问题讨论】:
标签: c++11 tensorflow build static-libraries qmake