windows環境VS2015編譯TensorFlow C++程序完全攻略


本文參考和綜合了多篇網絡博客文章,加以自己的實踐,最終終於在windows環境下,編譯出可以用於C++程序調用tensorflow API的程序,並執行成功。

考慮到網絡上關於這方面的資料還較少,特總結全過程如下,希望能幫助到有需要的碼農朋友,文中有部分文字步驟是借鑒他人文章,引用路徑在最后列出。

一、環境准備:

  1. 操作系統:windows8.1
  2. 安裝visual stduio2015
  3. 安裝Swigwin-3.0.12,注意其下載解壓以后即可使用,本人放置路徑在D:/lib/swigwin-3.0.12,可執行文件地址為 D:/swigwin-3.0.12/swig.exe
  4. 安裝python3.5,安裝時注意選擇將路徑添加到環境變量。
  5. 安裝CMake-3.8.0 ,安裝時注意選擇將路徑添加到環境變量。
  6. 安裝Git,用於在編譯過程中從GitHub上下載依賴項。
  7. 將GitHub上TensorFlow的master分支 下載並解壓到文件夾D:\tf中,編輯文件tensorflow/tensorflow/contrib/cmake/CMakeLists.txt,將第87行至93行修改如下:
 1 if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
 2   include(CheckCXXCompilerFlag)
 3   CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
 4   if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
 5     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
 6   else()
 7     CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED)
 8     if(COMPILER_OPT_ARCH_AVX_SUPPORTED)
 9       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
10     endif()
11   endif()
12 endif()

 二、使用CMAKE設置各項編譯參數

  1. 打開下載tensorflow源文件的根目錄,本文路徑是E:TF Code/TensorFlow,在路徑下進入../tensorflow\contrib\cmake, 新建文件夾\build。
  2. 打開已安裝的CMAKE-GUI工具,進行各項編譯選項的配置,本文配置界面如下:
  3.             
  4. 點擊configue,下方提示Configuring done后,點擊Generate,等待Generating done后完成編譯設置。如果中間有報錯,請檢測各路徑設置是否正確。

三、編譯生成tensorflow庫文件

  1.  打開visual studio2015,打開E:\TF Code\tensorflow\tensorflow\contrib\cmake\build下的ALL_BUILD項目。我們在此只以release版本為例,所以檢查編譯平台是
  2. 點擊生成解決方案,編譯的時間很長,我的筆記本電腦編譯一次大概3到4個小時,編譯到最后一般都會報錯
    fatal error C1060: compiler is out of heap space 沒關系,等待整個工程全部編譯完成(據說內存特別大的電腦不會報)。
  3. 找到tf_core_kernels項目,右鍵單獨編譯,操作如下圖。

    

  4. tf_core_kernels項目編譯成功后,再同樣對tensorflow_static作單獨編譯,最后再對tensorflow作單獨編譯。.

   這樣tensorflow.lib和tensorflow.dll文件就可以編譯出來了,生成的庫文件路徑在..\tensorflow\tensorflow\contrib\cmake\build\Release下。

四、使用tensorflow庫文件編寫C++程序

  1. 在vs2015中創建一個新的Win32控制台工程TestTensorFlow,注意也必須把編譯平台設置成
  2. 新建一個TestTensorFlow.h,在其中輸入
    #pragma once
    
    #define COMPILER_MSVC
    #define NOMINMAX  
  3. 對應的TestTensorFlow.CPP文件中輸入如下:
    // TestTensorFlow.cpp : 定義控制台應用程序的入口點。
    //
    #include "stdafx.h"
    
    #include <vector>
    #include <eigen/Dense>
    
    #include "TestTensorFlow.h"
    #include "tensorflow/core/public/session.h"
    #include "tensorflow/cc/ops/standard_ops.h"
    using namespace tensorflow;
    
    GraphDef CreateGraphDef()
    {
    	Scope root = Scope::NewRootScope();
    
    	auto X = ops::Placeholder(root.WithOpName("x"), DT_FLOAT,
    		ops::Placeholder::Shape({ -1, 2 }));
    	auto A = ops::Const(root, { { 3.f, 2.f },{ -1.f, 0.f } });
    
    	auto Y = ops::MatMul(root.WithOpName("y"), A, X,
    		ops::MatMul::TransposeB(true));
    
    	GraphDef def;
    	TF_CHECK_OK(root.ToGraphDef(&def));
    
    	return def;
    }
    
    int main()
    {
    	GraphDef graph_def = CreateGraphDef();
    
    	// Start up the session
    	SessionOptions options;
    	std::unique_ptr<Session> session(NewSession(options));
    	TF_CHECK_OK(session->Create(graph_def));
    
    	// Define some data.  This needs to be converted to an Eigen Tensor to be
    	// fed into the placeholder.  Note that this will be broken up into two
    	// separate vectors of length 2: [1, 2] and [3, 4], which will separately
    	// be multiplied by the matrix.
    	std::vector<float> data = { 1, 2, 3, 4 };
    	auto mapped_X_ = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>>
    		(&data[0], 2, 2);
    	auto eigen_X_ = Eigen::Tensor<float, 2, Eigen::RowMajor>(mapped_X_);
    
    	Tensor X_(DT_FLOAT, TensorShape({ 2, 2 }));
    	X_.tensor<float, 2>() = eigen_X_;
    
    	std::vector<Tensor> outputs;
    	TF_CHECK_OK(session->Run({ { "x", X_ } }, { "y" }, {}, &outputs));
    
    	// Get the result and print it out
    	Tensor Y_ = outputs[0];
    	std::cout << Y_.tensor<float, 2>() << std::endl;
    
    	session->Close();
    	getchar();
    } 
  4.  設置要包含的tensorflow頭文件路徑,右鍵項目屬性——C/C++——附加包含目錄
    E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\Debug
    E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\external\nsync\public
    E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src
    E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\external\eigen_archive
    E:\TF Code\tensorflow\tensorflow\contrib\cmake\build
    E:\TF Code\tensorflow
    E:\TF Code\tensorflow\third_party\eigen3
  5.  引入tensorflow.lib文件,右鍵項目——添加——現有項,找到..\tensorflow\tensorflow\contrib\cmake\build\Release下的tensorflow.lib 

             

  5.  設置預編譯選項,右鍵屬性——C/C++——預處理器,預處理器定義中加入PLATFORM_WINDOWS

            

  6. 編譯TestTensorFlow項目,就可以成功生成TestTensorFlow.exe了。

  7.直接運行程序,會報錯

  8,把..\tensorflow\tensorflow\contrib\cmake\build\Release下的tensorflow.dll拷貝到TestTensorFlow.exe同文件夾下,再運行即可成功得到輸出結果如下:

     

     輸出結果有一句警告,好像是我編譯參數還是跟CPU功能有不匹配,但是不影響執行結果,有知道如何解決的朋友可以留言給我,謝謝。

 

       參考:

  1. https://www.cnblogs.com/jliangqiu2016/p/7642471.html
  2. http://www.qingpingshan.com/m/view.php?aid=322808

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM