我可以使用静态C ++库tensorflow在一个独立的C ++程序,但无法使用静态库依赖于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工程,目标(测试多依赖)是建立与:
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 ++程序(执行)的可执行文件运行相同的命令,我得到的输出(同样只显示相关的库):
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
?提前致谢。
错误是因为在构建命令的qmake
目标包括库的命令!使用在-ltensorflow_framework -ltensorflow_cc
命令的工作秩序g++
。
如果订单不帮助解决。使用您的二进制LDD弄清楚,如果被添加的lib依赖。
这个变化基于您使用的是Linux的味道,但LD的一些版本,除非它的使用不会链接库。
在TF情况下,tensorflow_cc没有被链接到我的二进制文件,即使我指定-l tensorflow_cc。
解决的办法是添加轮候册, - 无按需标志GCC。 GCC处理从左到右的标志,所以你添加-ltensorflow之前指定这个标志*
LDD | grep的tensorflow
一个相关的问题似乎是力加载TF对Xcode的要求。使用force_load选项。 (对于静态IIb)的