【问题标题】:Using the tensorflow static library with qmake将 tensorflow 静态库与 qmake 一起使用
【发布时间】: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


    【解决方案1】:

    错误是因为qmake 目标的构建命令中包含的库的顺序!在g++ 命令中使用命令-ltensorflow_framework -ltensorflow_cc 有效。

    【讨论】:

      【解决方案2】:

      如果订单没有帮助修复。在您的二进制文件上使用 ldd 来确定是否正在添加 lib 依赖项。

      这会根据您使用的 linux 风格进行更改,但某些版本的 ld 不会链接库,除非使用它。

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

      解决方案是在 gcc 中添加 -Wl,--no-as-needed 标志。 GCC 从左到右处理标志,因此在添加 -ltensorflow* 之前指定此标志

      ldd | grep 张量流


      一个相关的问题似乎是在 xcode 上强制加载 tf 的要求。使用 force_load 选项。 (对于静态库)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 2014-01-28
        • 1970-01-01
        相关资源
        最近更新 更多