ubuntu tensorflow源码编译C++库

文章详细描述了在Ubuntu18.04系统中,如何安装和配置CUDA10.0,CUDNN,bazel,protobuf,以及编译Tensorflow1.13.1的源代码,包括遇到的错误及解决方法,如gcc版本问题,protobuf版本不匹配,环境变量设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vcpkg

C++中用frugally-deep调用keras的模型并进行预测
添加链接描述

CUDA10.0支持的最高版本为ubuntu18.04,CUDA11.1.0开始有WSL-Ubuntu

查询版本
在这里插入图片描述
我的版本:
ubuntu 18.04
cuda 10.0
https://developer.nvidia.com/cuda-toolkit-archive
cudnn 7.4.2
https://developer.nvidia.com/rdp/cudnn-archive
bazel 0.19.2
https://github.com/bazelbuild/bazel
tensorflow 1.13.1
https://github.com/tensorflow/tensorflow
protobuf 3.6
https://github.com/protocolbuffers/protobuf

wsl2编译c++
Tensorflow c++源码编译(踩坑版)

前提

1.下载驱动
https://www.nvidia.cn/Download/index.aspx?lang=cn#
测试:nvidia-smi
2.下载cuda
https://developer.nvidia.com/cuda-toolkit-archive
测试:nvcc -V
3.下载cudnn
https://developer.nvidia.com/rdp/cudnn-archive
测试:cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
或 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

一、bazel

安装bazel

https://bazel.build/install/compile-source?hl=zh-cn

chmod +x bazel--installer-linux-x86_64.sh
./bazel--installer-linux-x86_64.sh --user
vim ~/.bashrc
export PATH=“ P A T H : PATH: PATH:HOME/bin”
source ~/.bashrc
测试:bazel --version

bazel删除

sudo rm -rf /usr/bin/bazel
sudo rm -rf ~/bin
sudo rm -rf /usr/bin/bazel

二、protobuf

安装protobuf

需要先安装 sudo apt-get install build-essential
./autogen.sh
./configure
make -j8
make check -j8
sudo make install
sudo vim /etc/profile
export LD_LIBRARY_PATH=/usr/local/lib
source /etc/profile
sudo ldconfig # 执行动态链接库管理命令,让可共享的动态链接库被找到
测试:protoc --version

错误

./autogen.sh: 38: ./autogen.sh: autoreconf: not found
解决方案:
sudo apt-get install autoconf automake libtool
sudo apt-get install automake
sudo apt-get install libtool

卸载protobuf

cd protobuf-3.6.1.2/
make uninstall

删除protobuf

1.删除执行文件
sudo rm -rf /usr/bin/protoc
2.删除所有protobuf 的链接库和头文件
sudo rm -rf /usr/include/google/protobuf #头文件
sudo rm -rf /usr/local/include/google/protobuf #头文件
sudo rm -rf /usr/lib/libproto* #库文件
sudo rm -rf /usr/local/lib/libproto* #库文件

三、编译tensorflow

./configure

错误

nvcc fatal : Unsupported gpu architecture ‘compute_89’
不要默认,CUDA 10.0对应的显卡算力范围是从3.0到7.5
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size. [Default is: 8.9]: 7.5
选项
在这里插入图片描述

2.bazel编译
如果不需要cuda版,则输入 bazel build --config=opt //tensorflow:libtensorflow_cc.so
如果需要cuda版,则输入 bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
这个过程需要全程保持联网(科学上网),会在编译的过程中联网下载很多依赖,时间较长,耐心等待
/tensorflow-1.13.0/bazel-bin/tensorflow/
会出现libtensorflow_cc.so以及libtensorflow_framework.so等文件
编译成功后,tensorflow-1.13.1目录下会出现 bazel-xxx 的几个文件,在tensorflow-1.13.1/bazel-bin/tensorflow文件下会出现 libtensorflow_cc.so 和 libtensorflow_framework.so 动态库文件。

重新编译
bazel clean
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

编译过程中出现的错误
错误1

x86_64-linux-gnu-gcc-11: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory
解决方法:
sudo apt-get update
sudo apt-get install --reinstall build-essential

错误2

Server terminated abruptly (error code: 14, error message: ‘Socket closed’, log file: ‘/home/cw/.cache/bazel/_bazel_cw/adb056c93effb4e59f521b0ce0ed0b80/server/jvm.out’)在这里插入图片描述
https://www.cnblogs.com/HelloCodeWrold/p/12967920.html
https://blog.51cto.com/zhangsz0516/6103347
https://blog.youkuaiyun.com/weixin_44958188/article/details/126893265
https://zhuanlan.zhihu.com/p/573352835

解决方法:
1.查看swap的大小
sudo swapon --show 或 sudo free -h
2.暂停swap
sudo swapoff -a
3.修改swap大小
sudo dd if=/dev/zero of=/swapfile bs=1G count=32 或 sudo fallocate -l 20G /swapfile
4.修改文件的权限
sudo chmod 600 /swapfile
5.将该交换文件更改为交换空间
sudo mkswap /swapfile
6.开机挂载 swap
sudo vim /etc/fstab
‘/swapfile none swap sw 0 0’
7.启动Swap
sudo swapon /swapfile 或 sudo swapon -a

错误3

gcc版本
安装gcc-9
./configure 选择 /usr/bin/gcc-9
sudo apt install gcc-9 g+±9
在这里插入图片描述

错误4

/home/cw/tensorflow-1.13.1/tensorflow/core/kernels/BUILD:4680:1: no such package ‘@icu//’: java.io.IOException: Error downloading [https://mirror.bazel.build/github.com/unicode-org/icu/archive/release-62-1.tar.gz, https://github.com/unicode-org/icu/archive/release-62-1.tar.gz] to /home/cw/.cache/bazel/_bazel_cw/f878ebe08e74da0c4869e3f2293c00b8/external/icu/release-62-1.tar.gz: Checksum was 86b85fbf1b251d7a658de86ce5a0c8f34151027cc60b01e1b76f167379acf181 but wanted e15ffd84606323cbad5515bf9ecdf8061cc3bf80fb883b9e6aa162e485aa9761 and referenced by ‘//tensorflow/core/kernels:string_util’

解决方案:
本地下载:https://link.zhihu.com/?target=https%3A//codeload.github.com/unicode-org/icu/tar.gz/release-62-1
安装apache2:sudo apt-get install apache2
安装apache2-dev sudo apt-get install apache2-dev
安装完成后 查看是否安装成功:sudo systemctl status apache2
sudo cp release-62-1.tar.gz /var/www/html
“http://localhost/release-62-1.tar.gz”
sha256 = “86b85fbf1b251d7a658de86ce5a0c8f34151027cc60b01e1b76f167379acf181”,

错误5

/usr/bin/env: ‘python’: No such file or directory
解决方案:sudo ln -s /usr/bin/python3 /usr/bin/python

错误6

添加链接描述
添加链接描述
error: #error This file was generated by a newer version of protoc which is~~~
编译的protobuf版本不对,重新安装protobuf,再bazel clean 后重新编译tensorflow。

四、编译其他依赖

1.cd ~/tensorflow-1.13.1/tensorflow/contrib/makefile/
2…/build_all_linux.sh
执行成功后,在tensorflow-1.13.1/tensorflow/contrib/makefile目录下:downloads文件夹下存放第三方依赖的一些头文件和静态库,比如absl cub double_conversion eigen fft2d gemmlowp googletest nsync re2。这些第三方库是可以自己安装的

错误:

eigen下载路径失效
https://bitbucket.org/eigen/eigen/get/9f48e814419e.tar.gz
修改download_dependencies.sh,注释下载eigen的命令
解决方法:手动下载并编译,下载链接:https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz
cd eigen
mkdir build
cd build
cmake …
sudo make install 默认路径为/usr/local/include

需要的头文件的路径
~/tensorflow-1.13.1/tensorflow/cc/ops
~/tensorflow-1.13.1/tensorflow/core/framework
~/tensorflow-1.13.1/tensorflow/core/graph
~/tensorflow-1.13.1/tensorflow/core/platform
~/tensorflow-1.13.1/tensorflow/core/public
.so文件
~/tensorflow-1.13.1/bazel-bin/tensorflow
其他库
~/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads

五、测试

test.cpp

#include <tf/tensorflow/core/platform/env.h>
#include <tf/tensorflow/core/public/session.h>
#include <iostream>
using namespace std;
using namespace tensorflow;
int main()
{
    Session* session;
    Status status = NewSession(SessionOptions(), &session);
    if (!status.ok()) {
        cout << status.ToString() << "\n";
        return 1;
    }
    cout << "Session successfully created.\n";
}

CMakeLists.txt
#指定 cmake 的最小版本
cmake_minimum_required(VERSION 2.8.8)
#项目名称/工程名
project(demo)
#设置c++编译器
#Set C++14 as standard for the whole project
set(CMAKE_CXX_STANDARD 14)
#设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径
set(TENSORFLOW_DIR /home/cw/tensorflow-1.13.1)
#将源码目录保存到变量中
aux_source_directory(./src DIR_SRCS) # 搜索当前目录下的所有.cpp文件
#add_library(demo ${SRC_LIST}) #明确指定包含哪些源文件
#设置包含的目录,项目中的include路径,换成自己的路径即可
include_directories(
KaTeX parse error: Expected 'EOF', got '#' at position 297: …e/eigen3 ) #̲设置链接库搜索目录,项目中li…{TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11)
link_directories(${TENSORFLOW_DIR}~/tensorflow-1.13.1/bazel-bin/tensorflow) #动态链接库目录
#添加要编译的可执行文件
#add_executable(demo test.cpp)
add_executable(demo ${DIR_SRCS}) ## 生成可执行文件
#设置 target 需要链接的库
#添加可执行文件所需要的库,连接libtensorflow_cc.so和libtensorflow_framework库,链接动态链接库
#target_link_libraries(demo tensorflow_cc tensorflow_framework)
target_link_libraries(demo ~/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_cc.so ~/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_framework.so)

<think>好的,我现在要帮用户解决如何获取和使用TensorFlow 2.3.0的C++的问题。首先,我需要回忆一下TensorFlow的安装方式。通常,Python版本是通过pip安装的,但C++可能需要不同的方法。 用户提到的是TensorFlow 2.3.0,这个版本可能比较旧,我需要确认官方是否还提供预编译C++。记得TensorFlowC++可以通过源码编译或者使用预编译的二进制文件。但官方的预编译版本可能只提供特定平台的,或者某些版本可能不再维护。 接下来,我应该分步骤考虑。首先,建议用户查看官方文档是否有相关说明。如果用户需要特定版本,可能需要从GitHub的发布页面下载。比如,TensorFlow的GitHub仓可能有各个版本的发布包,里面包含源代码,用户需要自己编译。 然后,编译过程可能需要使用Bazel构建工具。需要提醒用户安装Bazel的正确版本,因为TensorFlow 2.3.0可能对Bazel版本有要求。比如,可能需要Bazel 3.1.0或更高版本,用户需要根据官方文档确认。 另外,用户可能需要安装一些依赖项,比如Python、NumPy等,即使他们只需要C++,因为构建过程可能需要这些依赖。编译完成后,生成的文件可能是.so或.a文件,用户需要链接这些到自己的C++项目中。 如果用户不想自己编译,可能需要寻找第三方提供的预编译包,但这时候需要注意兼容性和安全性问题。比如,某些Linux发行版的社区可能有维护的包,或者使用Docker镜像。但TensorFlow官方可能不推荐这种方式,所以需要提醒用户谨慎。 最后,使用示例部分,可能需要提供一个简单的C++代码示例,展示如何加载TensorFlow和运行计算图。同时,提醒用户注意路径和版本的问题,避免运行时错误。 现在需要检查这些步骤是否准确,是否有遗漏。比如,是否需要配置环境变量,或者安装其他依赖如CUDA和cuDNN(如果使用GPU支持)。对于TensorFlow 2.3.0,可能需要特定版本的CUDA,比如CUDA 10.1,这需要用户提前安装。 另外,用户提到的引用链接是关于Ubuntu的toolchain测试仓,可能与问题无关,可能用户复制时出错了。这时候可能需要忽略该引用,或者提示用户检查引用是否正确。 综上所述,回答应该分步骤指导用户如何下载源码、安装依赖、编译文件,并提供使用示例。同时,提醒可能的问题和替代方案,如Docker或第三方源。</think>以下是关于TensorFlow 2.3.0 C++的获取和使用的分步指南: --- ### 1. 获取TensorFlow C++的两种方式 #### 方式一:通过源码编译 1. **下载源码** 从GitHub仓下载指定版本: ```bash git clone -b v2.3.0 https://github.com/tensorflow/tensorflow.git cd tensorflow ``` 2. **安装依赖工具** - 安装Bazel构建工具(要求Bazel ≥3.1.0)[^1] - 安装Python、NumPy等基础依赖: ```bash sudo apt install python3-dev python3-pip pip3 install numpy wheel ``` 3. **配置编译选项** 运行配置脚本,按需选择CPU/GPU支持: ```bash ./configure ``` 4. **编译C++** 编译动态链接(.so文件): ```bash bazel build --config=opt //tensorflow:libtensorflow_cc.so ``` 编译完成后,文件位于: `bazel-bin/tensorflow/libtensorflow_cc.so` 头文件位于:`tensorflow`和`third_party`目录下。 #### 方式二:使用预编译包(非官方) 部分第三方提供预编译包,但需注意兼容性风险: - 通过APT仓(如适用于Ubuntu): ```bash sudo add-apt-repository ppa:ubuntu-toolchain-r/test # 示例引用,非官方源[^1] sudo apt install tensorflow-2.3.0-cpp ``` --- ### 2. 在C++项目中使用 #### 步骤1:包含头文件和链接 ```cpp #include <tensorflow/c/c_api.h> #include <iostream> int main() { std::cout << "TensorFlow C++版本: " << TF_Version() << std::endl; return 0; } ``` #### 步骤2:编译时指定路径 ```bash g++ main.cpp -I/path/to/tensorflow/include \ -L/path/to/tensorflow/lib -ltensorflow_cc -ltensorflow_framework -o main ``` #### 步骤3:运行前设置路径 ```bash export LD_LIBRARY_PATH=/path/to/tensorflow/lib:$LD_LIBRARY_PATH ./main ``` --- ### 3. 替代方案:使用Docker 若编译困难,可通过官方Docker镜像快速部署: ```bash docker pull tensorflow/tensorflow:2.3.0 docker run -it tensorflow/tensorflow:2.3.0 bash ``` --- ### 注意事项 - **GPU支持**:需提前安装CUDA 10.1和cuDNN 7.6[^2] - **版本兼容性**:确保所有依赖项(如Protobuf)与TensorFlow 2.3.0匹配 - **性能优化**:编译时启用`--config=opt`以使用SIMD指令加速 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ccsu_cw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值