准备:visual studio 2015 update 3
git
Cmake v3.6.3
python3.6
tensorflow r1.8
swigwin
因为官方已经放弃对cmake方式的支持了,所以新版本的tensorflow用cmake方式编译是很难成功的。官方推荐用bazel方式编译,虽然能编译出lib,但是特别坑的是没有导出符号,导致在使用库的时候会出LNK 2001错误。这里我试了tensorflow r1.13、tensorflow r1.12、tensorflow r1.11、tensorflow r1.9都没编译成功,最后回退到tensorflow r1.8版本。
一、CMakeLists.txt
修改tensorflow/contrib/cmake/CMakeList.txt,将
if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
endif()
endif()
修改为
if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
else()
CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED)
if(COMPILER_OPT_ARCH_AVX_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
endif()
endif()
endif()
二、cmake
在tensorflow/contrib/cmake下新建一个build文件夹,打开cmake-gui
Where is the source code选择:tensorflow/contrib/cmake
Where to build the binaries选择:tensorflow/contrib/cmake/build
点击Configure,
选择Visual Studio的版本,点击Finish。
这是第一次configure之后的配置,
按照自己的需求修改如下:
注意勾选tensorflow_BUILD_SHARED_LIB,取消勾选tensorflow_ENABLE_GRPC_SUPPORT。
再次点击Configure,这下没有红色了。
点击Generate。输出如下信息表示已经成功生成工程文件了。
三、编译tensorflow
打开tensorflow.sln。
按照【Tensorflow】Windows编译tensorflow时LINK : fatal error LNK1181: 无法打开输入文件“\pywrap_tensorflow_internal.lib修改几个工程的配置属性。
选择项目ALL_BUILD生成。
全部生成成功之后,选择生成INSTALL项目,会把相应的bin文件,头文件和库文件拷贝到cmake配置时设置的CMAKE_INSTALL_PREFIX路径下。
其中,bin文件夹
include文件夹
lib文件夹
至此,cpu版本的tensorflow dll和lib编译过程结束。
四、测试
测试一下是否正确编译了,在bin文件夹下有一个tf_tutorials_example_trainer.exe,在cmd中运行它,如果输出类似如下内容,则证明编译是ok的。
在编译过程还有可能遇到的错误请参考链接:
【Tensorflow】windows编译tensorflow.sln的INSTALL时 error MSB3073: 命令“setlocal.... "