在 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 选项。 (对于静态库)
我能够在独立的 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 选项。 (对于静态库)