开启/WHOLEARCHIVE选项时,Windows+VS无法链接自建TensorFlow求助
解决TensorFlow 1.5 C++程序编译失败问题(Windows 10 + VS2015环境)
你已经成功从源码编译出TensorFlow 1.5,但在编写调用它的C程序时卡了壳——尤其是实例化会话这一步。结合Windows下TensorFlow C开发的常见坑,我整理了几个排查和解决方向:
1. 对齐项目与TensorFlow的编译配置
TensorFlow的C++依赖对环境一致性要求极高,你的VS2015项目必须和编译TensorFlow时的配置完全匹配:
- 平台工具集:确认项目使用
Visual Studio 2015 (v140),不能用更高版本的工具集 - 编译模式:TensorFlow编译用的是Release,你的项目就必须用Release;Debug模式同理,两者绝对不能混用
- 目标架构:TensorFlow通常编译为x64,你的项目也要把目标平台设置为x64,不能选x86
2. 配置正确的包含目录与库目录
你需要把TensorFlow编译生成的头文件和库文件路径添加到VS项目中:
- 包含目录:添加TensorFlow源码根目录(比如
D:\tensorflow-1.5),以及编译生成的bazel-bin下的头文件路径(比如D:\tensorflow-1.5\bazel-bin\tensorflow) - 库目录:添加TensorFlow编译生成的库文件所在路径,一般是
D:\tensorflow-1.5\bazel-bin\tensorflow,这里会有tensorflow.lib/tensorflow.dll(Release模式)或tensorflowd.lib/tensorflowd.dll(Debug模式)
3. 完善链接器输入配置
在VS项目的链接器->输入中,添加对应的库文件:
- Release模式添加
tensorflow.lib - Debug模式添加
tensorflowd.lib
另外,记得把对应的dll文件复制到你的项目输出目录下,不然运行时会出现依赖缺失的错误。
4. 修正代码中的细节问题
看你给出的代码片段,NewSession的调用不完整,正确的会话实例化方式应该是这样:
#define COMPILER_MSVC #define NOMINMAX #include "tensorflow/core/public/session.h" #include "tensorflow/core/platform/env.h" using namespace tensorflow; void load_model() { SessionOptions options; std::unique_ptr<Session> session(NewSession(options)); if (!session) { // 在这里处理会话创建失败的情况 } // 后续的模型加载或计算操作... }
注意要额外包含tensorflow/core/platform/env.h,NewSession需要传入SessionOptions参数,返回的指针建议用智能指针管理,避免内存泄漏。
5. 检查CUDA与cuDNN的环境配置
虽然你已经编译成功TensorFlow,但项目编译时可能还是找不到CUDA相关依赖:
- 确认
CUDA_PATH、CUDNN_INCLUDE、CUDNN_LIB这些环境变量设置正确,且VS项目能读取到它们 - 可以在项目的VC++目录中,手动添加CUDA的包含目录(比如
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include)、库目录(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64),以及cuDNN的对应目录
如果还是解决不了,建议把编译时的具体错误信息贴出来,这样能更精准地定位问题~
内容的提问来源于stack exchange,提问作者kafman
相关产品推荐
相关产品推荐

