C++ 过程
源码
我这里用的是tensorflow 1.13.1版本
bazel
我这里系统是Windows下的WSL, 通过Windows的VsCode Remote 到 WSL 可以实现 Windows 写代码 但是环境都是Linux的 很方便
这个东西也有版本要求,但是没那么严格必须1v1,我这用的0.19.2我之前也用0.20.0编译过这个版本,也是可行的, 也可以参考下边的工具对应版本, MacOS和Linux大差不差 Windows 稍微不太一样
Windows-CPU
版本 | Python 版本 | 编译器 | 编译工具 |
---|---|---|---|
tensorflow-1.13.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
Linux-CPU
版本 | Python 版本 | 编译器 | 编译工具 |
---|---|---|---|
tensorflow-1.13.1 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
MacOS-CPU
版本 | Python 版本 | 编译器 | 编译工具 |
---|---|---|---|
tensorflow-1.13.1 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.10.1 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.10.1 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.8.1 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.8.1 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 |
Windows-GPU
版本 | Python 版本 | 编译器 | 编译工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.13.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
Linux-GPU
版本 | Python 版本 | 编译器 | 编译工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.13.1 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
MacOS-GPU
版本 | Python 版本 | 编译器 | 编译工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 | 5.1 | 8 |
protobuf
最重要的一个,也是最恶心人的一个库
这个弄不好,就算C/C++动态库编译好了, C/C++代码也编译不了
这个我试过自己随便装一个(铁定凉)
然后试图用tensorflow/contrib/makefile下的 build_all_linux.sh 来下载(也凉了, 不知道什么鬼设定对应版本下边的依赖也是只下载最新的)
不过这个还是要执行的 因为后期 C++ 代码会用到 absl 和 eigen 这两个库 虽然没有强行要求版本,也可以自己去下载,毕竟这个是把所有依赖包都拿下来了,可能其他包你也会用到,虽然比较臃肿,但推荐还是搞这个
不是推荐 就下protobuf 2.6.1这个版本吧 很稳
别忘了加入环境变量 测试一下↓
1 | protoc --version |
动态库
1 | mv tensorflow 1.13.1/ tensorflow/ |
这里只编译C++, 个人爱好 也可自己编译C的, 不过C官方有API 推荐用人家的API, 除非不嫌麻烦造轮子
1 | bazel build --config=opt //tensorflow:libtensorflow.so |
编译完目录下会出现 bazel-xxx 的几个文件
动态库就在 bazel-bin/tensorflow 中
环境变量
一般系统都默认/usr/local/include 或者 lib 库 加入环境变量了, 我们可以直接把需要的东西扔进去
1 | sudo mkdir /usr/local/include/tf |
示例程序
代码有点多, 这里有给出一个examples + model 和一个CNN demo (包含C的 可切换)
编译通过 Cmake 编译, 可自行更改
examples + model 结果
1 | Output tensor size:1 |
CNN demo 结果
1 | value[0] = 6.40457e-09 |
C 过程
下载
解压缩
解压缩下载的归档文件,其中包含要包含在 C 程序中的头文件以及要与之关联的共享库。在 Linux 和 macOS 上,您可能需要解压缩到 /usr/local/lib:
1 | sudo tar -C /usr/local -xzf "downloaded file" |
连接器
在 Linux/macOS 上,如果将 TensorFlow C 库解压缩到系统目录(例如 /usr/local),请使用 ldconfig 配置链接器:
1 | sudo ldconfig |
如果将 TensorFlow C 库解压缩到非系统目录(例如 ~/mydir),请配置链接器环境变量:
Linux | mac OS |
---|---|
export LIBRARY_PATH=$LIBRARY_PATH:~/mydir/lib | export LIBRARY_PATH=$LIBRARY_PATH:~/mydir/lib |
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/mydir/lib | export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/mydir/lib |
示例程序
安装 TensorFlow C 库后,使用以下源代码创建一个示例程序 (hello_tf.c):
1 | #include <stdio.h> |
编译
编译示例程序以创建可执行文件,然后运行:
1 | gcc hello_tf.c -ltensorflow -o hello_tf |
上述命令会输出:Hello from TensorFlow C library version number
成功:TensorFlow C 库已配置完毕。
如果程序无法编译,请确保 gcc 可以访问 TensorFlow C 库。如果解压缩到 /usr/local,请将库位置显式传递给编译器:
1 | gcc -I/usr/local/include -L/usr/local/lib hello_tf.c -ltensorflow -o hello_tf |
参数含义:
a) -I/usr/local/include/tf > 依赖的include文件
b) -L/usr/local/lib/libtensorflow_cc > 编译好的libtensorflow_cc.so文件所在的目录
c) -ltensorflow_cc > .so动态库的名字
总结
系列问题不一一列上, 说实话这里的错有的真的烦人, 可以在留言区给我留言, 或者去github tensorflow 的 issue找一下或留言 ╮(╯▽╰)╭)
感觉有帮助可以在下方打赏哦 (#^.^#), 你的支持就是我的动力