使用具有QMAKE的tensorflow静态库

问题描述 投票:1回答:2

我可以使用静态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?提前致谢。

c++11 tensorflow build static-libraries qmake
2个回答
2
投票

错误是因为在构建命令的qmake目标包括库的命令!使用在-ltensorflow_framework -ltensorflow_cc命令的工作秩序g++


0
投票

如果订单不帮助解决。使用您的二进制LDD弄清楚,如果被添加的lib依赖。

这个变化基于您使用的是Linux的味道,但LD的一些版本,除非它的使用不会链接库。

在TF情况下,tensorflow_cc没有被链接到我的二进制文件,即使我指定-l tensorflow_cc。

解决的办法是添加轮候册, - 无按需标志GCC。 GCC处理从左到右的标志,所以你添加-ltensorflow之前指定这个标志*

LDD | grep的tensorflow


一个相关的问题似乎是力加载TF对Xcode的要求。使用force_load选项。 (对于静态IIb)的

© www.soinside.com 2019 - 2024. All rights reserved.