Tensorflow工程实践: tensorflow1.8 + vs2017 + cmake 编译生成c++ 库包

    xiaoxiao2025-08-05  10

    因为要做工程化,所以最近用了一些时间来研究c++版本的tensorflow  当然官网没有提供现成的库包,只能自己根据原码编译。网上翻了一遍,发现资料很多 但都相对较为零散,这边记录一下自己编译库包(Release和Debug版本)的流程以及自己踩的坑。

    个人尝试了很多个版本,但相对只有1.8版本通过编译,1.10版本总有rpc相关错误(设置了OFF,任报错),在往上的高版本,cmake生成vs工程都困难重重,就没有继续研究下去 。

    个人电脑环境:

    win10

    vs2017

    cmake3.8.2(3以上版本都可)

    Swigwin-3.0.12

    tensorflow-r1.8

    python3.6(Anaconda)

    网络要求:

    编译时候会从git和一些国外网站在线下载一些依赖库包,所以提取要准备好自己的网络(各位应该都懂。。),否则一直处于time out状态.

    Cmake构建:

    在tensorflow-r1.8\tensorflow\contrib\cmake下面新建一个build文件夹,作为vs工程的生成目录.

    修改cmakeList文件

    1、招到if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)那一段代码,用下面的替换:

    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()

    2、设置option(tensorflow_ENABLE_GRPC_SUPPORT "Enable gRPC support" OFF)    设置为off

    cmake构建命令:

         打开vs2017的x64命令工具(管理员身份), 开启powershell(方便命令操作), 切换到build文件夹,输入如下cmake命令:

    release版本:

    cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release -DSWIG_EXECUTABLE=G:/TFCode/Tool/swigwin-3.0.12/swig.exe -DPYTHON_EXECUTABLE=C:/ProgramData/Anaconda3/envs/py36/python.exe -DPYTHON_LIBRARIES=C:/ProgramData/Anaconda3/envs/py36/libs/python36.lib -Dtensorflow_ENABLE_GPU=OFF -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF -Dtensorflow_BUILD_SHARED_LIB=ON

    Debug版本:

    cmake .. -A x64 -DCMAKE_BUILD_TYPE=Debug -DSWIG_EXECUTABLE=G:/TFCode/Tool/swigwin-3.0.12/swig.exe -DPYTHON_EXECUTABLE=C:/ProgramData/Anaconda3/envs/py36/python.exe -DPYTHON_LIBRARIES=C:/ProgramData/Anaconda3/envs/py36/libs/python36_d.lib -Dtensorflow_ENABLE_GPU=OFF -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF -Dtensorflow_BUILD_SHARED_LIB=ON

    两句命令差别在于DCMAKE_BUILD_TYPE参数 和 DPYTHON_LIBRARIES参数

    VS编译命令

    构建好vs工程后还是执行vs编译命令(build目录下):如下:

    set PreferredToolArchitecture=x64

    防止第二遍中编译器的堆空间不足的错误

    release:

    MSBuild /p:Configuration=Release ALL_BUILD.vcxproj

    debug

    MSBuild /p:Configuration=Debug ALL_BUILD.vcxproj

    编译时长根据电脑性能决定 一般在3小时左右   基本不存在一次通过的可能 。

    提取安装包:

    编译完成之后,最后的一步是从十几个G的编译结果中提取安装包(install).在build文件夹下执行如下命令:

    release: cmake.exe -DBUILD_TYPE=Release -P cmake_install.cmake debug: cmake.exe -DBUILD_TYPE=Debug-P cmake_install.cmake

    生成如下安装文件:

    常见错误:

    1

    编译debug版本报错,错误原因就是DPYTHON_LIBRARIES参数没有设置为python_d.lib。 conda命令安装的python一般没有pythonde debug版本。可以直接去官网下载安装包,在安装的时候直接勾选上generate  debug library的选项,就有了python_d.lib文件了.

    2

    错误和第二遍编译器的对空间不足基本一样,如果设置了set PreferredToolArchitecture=x64应该不会在报错,如果报了错误也不慌,等当前编译结束后,继续执行一遍编译命令.

    3 re2 testing导致编译失败

    re2包提供了正则表达式的功能,文件夹testing中是测试文件,在TensorFlow运行过程中其实不需要这些测试功能,所以可以通过禁止编译re2的测试部分来移除这些错误

    修改tensorflow\contrib\cmake\build\re2\src\re2\CMakeLists.txt配置项为OFF,然后在重新执行编译命令

    option(RE2_BUILD_TESTING “enable testing for RE2” OFF)

    简单的调用实例 (参考tensorflow官方文档)

    注意:

    实际调用tensorflow库包时候,需要加两个预处理命令否者编译会报错。

    COMPILER_MSVC NOMINMAX #include<iostream> #include "tensorflow/cc/client/client_session.h" #include "tensorflow/cc/ops/standard_ops.h" #include "tensorflow/core/framework/tensor.h" int main() { using namespace tensorflow; using namespace tensorflow::ops; Scope root = Scope::NewRootScope(); //Matrix A = [3 2; -1 0] auto A = Const(root, { { 3.f, 2.f },{ -1.f, 0.f } }); //Vector b = [3 5] auto b = Const(root, { { 3.f, 5.f } }); //v = Ab^T auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true)); std::vector<Tensor> outputs; ClientSession session(root); //Run and fetch v TF_CHECK_OK(session.Run({ v }, &outputs)); //Expect outputs[0] == [19; -3] LOG(INFO) << outputs[0].matrix<float>(); return 0; }

     

    最新回复(0)