TensorFlow 1.6 C++项目中array_ops.h等头文件位置咨询
array_ops.h的问题 看起来你遇到的问题是手动搭建的纯C++项目没正确引入TensorFlow构建过程中生成的头文件路径。毕竟TensorFlow的很多核心头文件(比如array_ops.h)是Bazel构建时自动生成的,默认不会出现在常规源码目录里,只会存放在Bazel缓存或构建输出目录中。下面给你两种可靠的解决方案:
方案1:用Bazel构建你的新项目(推荐)
这是适配TensorFlow C++开发最省心的方式,因为TensorFlow本身就是用Bazel管理依赖的,能自动处理所有头文件和库的路径问题:
在你的项目根目录创建
BUILD文件,内容如下:cc_binary( name = "your_app", # 替换成你的应用名称 srcs = ["your_app.cpp"], # 替换成你的源码文件名 deps = [ "@tensorflow//tensorflow/core:framework", "@tensorflow//tensorflow/core:lib", ], )同样在项目根目录创建
WORKSPACE文件,指定你的TensorFlow源码路径(把/path/to/your/tensorflow替换成你实际的TensorFlow源码根目录):workspace(name = "your_project") local_repository( name = "tensorflow", path = "/path/to/your/tensorflow", )最后在项目根目录执行构建命令:
bazel build //:your_app构建完成后,可执行文件会在
bazel-bin/your_app路径下。
方案2:手动配置编译路径(适合Makefile/CMake)
如果不想用Bazel,需要手动把TensorFlow的源码目录、Bazel生成文件目录以及依赖库路径都加入编译配置:
先定义你的TensorFlow源码根目录(比如
TF_ROOT=~/tensorflow),然后确认以下路径存在:${TF_ROOT}/bazel-genfiles:这里存放Bazel构建时生成的所有头文件,包括你要找的array_ops.h(路径大概是${TF_ROOT}/bazel-genfiles/tensorflow/ops/array_ops.h)${TF_ROOT}/bazel-tensorflow/external/eigen_archive:Eigen数学库依赖${TF_ROOT}/bazel-tensorflow/external/com_google_protobuf/src:Protobuf依赖
如果用g++直接编译,命令示例如下:
g++ your_app.cpp -o your_app \ -I${TF_ROOT} \ -I${TF_ROOT}/bazel-genfiles \ -I${TF_ROOT}/bazel-tensorflow/external/eigen_archive \ -I${TF_ROOT}/bazel-tensorflow/external/com_google_protobuf/src \ -L${TF_ROOT}/bazel-bin/tensorflow/core \ -ltensorflow_framework如果用CMake,需要在
CMakeLists.txt中添加对应的include目录和链接库:cmake_minimum_required(VERSION 3.0) project(your_app) set(TF_ROOT "/path/to/your/tensorflow") include_directories( ${TF_ROOT} ${TF_ROOT}/bazel-genfiles ${TF_ROOT}/bazel-tensorflow/external/eigen_archive ${TF_ROOT}/bazel-tensorflow/external/com_google_protobuf/src ) link_directories(${TF_ROOT}/bazel-bin/tensorflow/core) add_executable(your_app your_app.cpp) target_link_libraries(your_app tensorflow_framework)
另外要注意:你的代码中引入头文件的语句应该是#include <tensorflow/ops/array_ops.h>,确保路径和实际生成的文件结构一致。
之前你的C示例能正常运行,大概率是因为它是通过Bazel构建的,自动处理了这些依赖路径,而你新建的纯C项目没有配置这些,所以才会找不到头文件。
内容的提问来源于stack exchange,提问作者jet

