在 qmake 中使用 tensorflow 静态库

Using the tensorflow static library with qmake

我能够在独立的 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 抛出以下 error:

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 未显示为测试可执行文件的依赖项,而它是 [=20= 的依赖项] 文件。但是,它们都使用相同的 class infer.h 作为它们的依赖项(qmake 目标间接依赖于 infer.h 即它包含使用 class 中定义的头文件 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 目标的构建命令中包含的库的顺序!在 g++ 命令中使用命令 -ltensorflow_framework -ltensorflow_cc 有效。

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

这会根据您使用的 linux 风格而变化,但某些版本的 ld 不会 link 一个库,除非它被使用。

在 tf 案例中,tensorflow_cc 没有被 link 编辑到我的二进制文件中,即使我指定了 -l tensorflow_cc。

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

之前指定此标志

ldd | grep张量流


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