编译tensorflow为静态库

需要将tensorflow从源码编译为静态库

参考教程:

https://blog.csdn.net/carbon06/article/details/82632781【教程1】

https://www.tensorflow.org/install/source?hl=zh-cn【教程2】

https://zhuanlan.zhihu.com/p/91869397【教程3】

https://zhuanlan.zhihu.com/p/57275506【教程4,通过bazel(据说不能编译静态库)】

发现新版本的tensorflow没有教程中提到的contrib文件夹,git checkout r1.14 切换回旧版本的tensorflow

在tensorflow/contrib/makefile文件夹下运行./build_all_linux.sh

报错,通过官方的教程2发现应该使用低版本的GCC(系统上本身版本为10.0),切换为GCC4.8.5

再次尝试编译,发现之前的错误可以通过,但报出新的错误,是glibc版本的问题

通过 ldd /bin/ls可以查看当前的库的路径(https://bbs.csdn.net/topics/310067175

通过/lib/libc.so.6可以查看其版本(https://blog.csdn.net/yaoike/article/details/4263185

通过strings /usr/lib64/libstdc++.so.6|grep GLIBCXX可以查看其详细信息

常见修改方式:删除原来的软连接,替换为新的软连接,但考虑到会破坏系统环境,我无法直接采用这种方式

最后成功方式,推测是通过LD_LIBRARY_PATH,发现不通过~/.bashrc 修改环境变量,仅修改GCC版本为低版本时,就可以成功编译

按照教程1进行测试

【问题1】教程1中为macos,此处为linux所以教程中的拷贝路径 tensorflow/contrib/makefile/downloads/nsync/builds/default.macos.c++11/libnsync.a

替换为default.linux.c++11/libnsync.a

【问题2】继续按照教程1测试,发现路径存在问题:tf_debug/load_model.cpp:4:10: fatal error: tensorflow/include/core/public/session.h: No such file or directory

教程1中此处应该有误,core应该放在include/tensorflow下,而不是include下,修改路径后不再报此错误

# include 路径存放tensorflow主要头文件
mkdir -p ~/tensorflow_libs/tensorflow/include/tensorflow
# 拷贝tensorflow 主要头文件
cp -r tensorflow/core ~/tensorflow_libs/tensorflow/include

【问题3】之后报新错:make[2]: *** No rule to make target `../tensorflow/nsync/lib/libnsync.a', needed by `load_model'.  Stop.

发现教程1中,CMakelist.txt里libnsync.a路径有误,不存在它所写的路径,TENSORFLOW_NSYNC_LIBRARY_PATH要与上面拷贝时路径一致

【问题4】链接时报大量错误:发现是链接多个静态库的顺序错误,A依赖B,则B应该在后面(教程1的顺序全部颠倒即可)

https://zhuanlan.zhihu.com/p/259893540?utm_source=wechat_session

【问题5】链接时报错:load_library.cc:(.text+0x121): undefined reference to `dlerror' 等类似错误

解决:在编译时加上选项:-ldl 即可

【问题6】链接时报错:undefined reference to `tensorflow::Status::ToString[abi:cxx11]() const'

解决:加上选项 -D_GLIBCXX_USE_CXX11_ABI=0即可

解决以上问题后教程1样例编译通过,运行时发现新的问题

【问题1】E tensorflow/core/common_runtime/session.cc:75] Not found: No session factory registered for the given session options: {target: "" config: } Registered factories are {}.

报错原因参考1:https://blog.csdn.net/gaussrieman123/article/details/106384853(动态库隐式加载的情况下一些全局静态变量没有初始化)

报错原因参考2:https://blog.csdn.net/weixin_30877493/article/details/96867587(采用这种方式解决了问题)

参考2中提到编译时需要添加参数 whole-archive

将指令修改为

TARGET_LINK_LIBRARIES(load_model -Wl,--whole-archive ${TENSORFLOW_LIBARY} -Wl,--no-whole-archive ${LOAD_MODEL_LIBRARIES} ${CMAKE_CXX_FLAGS})

此外还需要添加-lpthread选项

修改CMakelists.txt后重新编译,不再报以上错误

运行成功得到教程1中的三行输出

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本
### 回答1: TensorFlow 2.0是Google开发的一款开源机器学习框架,它是TensorFlow的最新版本。相对于早期版本,TensorFlow 2.0更加易用,具有更好的性能和更好的可维护性。TensorFlow 2.0提供了Keras API的全面支持,使得构建神经网络变得更加容易和快速。此外,TensorFlow 2.0还提供了Eager Execution模式,这意味着可以在Python环境下进行实时计算和调试,而不需要像以前一样需要构建计算图。总之,TensorFlow 2.0是一个非常强大的机器学习框架,可以帮助开发者更加高效地构建和训练模型。 ### 回答2: TensorFlow是一个开源的人工智能框架,它是由Google开发并发布的。TensorFlow 2是TensorFlow的第二个重要版本,并且在原有版本的基础上进行了许多改进和优化。 TensorFlow 2 有很多新的特性和功能。首先,它引入了Keras的高级API作为默认的API。这样做使得TensorFlow变得更加易用和直观,并且可以方便地进行快速原型设计和模型迭代。 其次,TensorFlow 2可以进行动态计算图和静态计算图的混合运行。这意味着可以根据需要选择使用静态计算图(在编译时优化)或者动态计算图(在运行时优化)来加快计算速度。 另外,TensorFlow 2还引入了Eager Execution机制。这种机制允许用户即时地运行代码并获取结果,而无需进行繁琐的图构建和会话管理。 TensorFlow 2还具有更好的可移植性和可部署性。用户可以将模型轻松地导出到不同的设备和平台上,并在其他环境中重新加载和运行模型。 最后,TensorFlow 2还提供了更多的工具和函数来支持模型的开发和调试。例如,TensorBoard可以可视化模型的训练过程和性能指标,tf.data可以高效地加载和预处理数据。 总而言之,TensorFlow 2是一个功能强大且易用的深度学习框架,它不仅提供了高级API和各种工具,还具有高度的可移植性和可扩展性。无论是研究人员还是开发者,都可以使用TensorFlow 2来更加轻松地开发和部署自己的机器学习模型。 ### 回答3: TensorFlow 2是谷歌开发的一种开源的深度学习框架。它是TensorFlow的第二个主要版本,旨在提供更直观、更易用的编程体验,以支持广泛的机器学习和深度学习任务。 TensorFlow 2的最大变化是引入了动态图机制。与TensorFlow 1相比,动态图允许用户更自由地定义和修改模型结构,无需预先定义计算图。这使得开发和调试更加简单和灵活,尤其对于初学者来说更容易上手。 此外,TensorFlow 2还内置了一些高级功能,如Keras API。Keras是一个流行的深度学习框架,它以简洁易懂的接口和模块化设计而闻名。TensorFlow 2将Keras作为其封装的一部分,使得构建和训练神经网络模型更加简单和高效。 在功能方面,TensorFlow 2支持多种数据类型、多种硬件平台和多种运行环境。可以使用CPU、GPU或TPU等不同硬件来加速模型训练和推理。此外,TensorFlow 2提供了丰富的工具、库和扩展,使其能够支持各种深度学习任务,如图像处理、自然语言处理和推荐系统等。 总而言之,TensorFlow 2是一个强大且易用的深度学习框架,它在设计上注重简单性和灵活性。无论是初学者还是专业人士,都可以利用TensorFlow 2来构建、训练和部署各种复杂的机器学习和深度学习模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值