1. 程式人生 > >VS2015編譯TensorFlow C++程式完全攻略

VS2015編譯TensorFlow C++程式完全攻略

本文參考和綜合了多篇網路部落格文章,加以自己的實踐,最終終於在windows環境下,編譯出可以用於C++程式呼叫tensorflow API的程式,並執行成功

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

一、環境準備:

  1. 安裝visual stduio2015
  2. 安裝Swigwin-3.0.12,注意其下載解壓以後即可使用,本人放置路徑在D:/lib/swigwin-3.0.12,可執行檔案地址為 D:/swigwin-3.0.12/swig.exe
  3. 安裝python3.6,安裝時注意選擇將路徑新增到環境變數。
  4. 安裝CMake-3.8.0
     ,安裝時注意選擇將路徑新增到環境變數。
  5. 安裝Git,用於在編譯過程中從GitHub上下載依賴項。
  6. 將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,在其中輸入
    1234#pragma once#define COMPILER_MSVC#define NOMINMAX  
  3. 對應的TestTensorFlow.CPP檔案中輸入如下:
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// 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 sessionSessionOptions 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

    相關推薦

    【轉】VS2015編譯TensorFlow C++程式完全

    VS2015編譯TensorFlow C++程式完全攻略 原文地址:https://blog.csdn.net/jacke121/article/details/80473648 本文參考和綜合了多篇網路部落格文章,加以自己的實踐,最終終於在windows環境下,編譯出可以用於C++程式呼叫

    VS2015編譯TensorFlow C++程式完全

    本文參考和綜合了多篇網路部落格文章,加以自己的實踐,最終終於在windows環境下,編譯出可以用於C++程式呼叫tensorflow API的程式,並執行成功考慮到網路上關於這方面的資料還較少,特總結全過程如下,希望能幫助到有需要的碼農朋友,文中有部分文字步驟是借鑑他人文章,引用路徑在最後列出。一、環境準備:

    C語言assert函式完全

    斷言assert函式,C語言assert函式完全攻略 對於斷言,相信大家都不陌生,大多數程式語言也都有斷言這一特性。簡單地講,斷言就是對某種假設條件進行檢查。在 C 語言中,斷言被定義為巨集的形式(assert(expression)),而不是函式,其原型定義在<assert.h>檔

    鏈棧的基本操作(入棧和出棧)及C語言實現完全

    鏈棧,即用線性表的連結串列結構實現棧的功能。實現過程中,鏈棧不需要建立頭結點,增加頭結點反而會增加程式的複雜性,因此連結串列中只需要建立一個頭指標就可以了。 鏈棧的實現思想是:用連結串列頭結點的一端作為棧的棧頂端,這樣做的好處是當資料元素壓棧或者彈棧時,直接使用頭指標就可以完成,不需要增設額外的指標。 例

    妖怪與和尚過河問題解法完全C++完整程式碼實現)

    如圖 1 所示。有三個和尚和三個妖怪(也可翻譯為傳教士和食人妖)要利用唯一一條小船過河,這條小船一次只能載兩個人,同時,無論是在河的兩岸還是在船上,只要妖怪的數量大於和尚的數量,妖怪們就會將和尚吃掉。現在需要選擇一種過河的安排,保證和尚和妖怪都能過河且和尚不能被妖怪吃掉。 圖 1 妖怪與和尚過河遊戲

    C/C++】BOOST 執行緒完全

       C++多執行緒開發是一個複雜的事情,mfc下提供了CWinThread類,和AfxBeginThread等等函式,但是在使用中會遇到很多麻煩事情,例如執行緒之間引數傳遞的問題,我們一般都是把引數new一個結構體,傳遞給子執行緒,然後釋放的工作交給了子執行緒,這樣不可避免會有記憶體洩漏的危險,例如執行緒

    C++ cout格式化輸出完全

    > 寫演算法題的時候突然發現自己忘記基本的C++:cout格式化輸出了,趕緊拉出以前的C++學習筆記重新看一看。 > > 部分內容來自教程:C語言中文網(一個很棒的網站) 有時希望按照一定的格式進行輸出,如按十六進位制輸出整數,輸出浮點數時保留小數點後面兩位,輸出整數時按 6 個數字的寬度輸出,寬度不

    【Head First Servlets and JSP】筆記23:Expression Language(EL) 完全

    首部 基本 light == 命名 shm sign pack index 基本上是《Head First Servlets and JSP》內容的整理、擴充。順便推薦一個供參考的JSP教程:JSP Tutorial 內容很全面,還有一些有趣的實例。 完整代碼參考

    windows 下編譯tensorflow c++庫過程記錄

    生成 native uil 定義 arch lin share lock bsp 1. 準備 windows 10系統、3.6GHz cpu、16G 內存 visual studio 2017 or 2015 下載安裝git 下載安裝cmake 下載安裝swi

    【alert(1) to win】不完全

    14. element PE win 一次 RM 處理 one pan alert(1) to win 一個練習XSS的平臺,地址:https://alf.nu/alert1 Warmup(14) 給出了一段JavaScript代碼 function escape(s)

    win10編譯tensorflow C++介面

    首先,我覺得這是一個比較DT的活,因為,tensorflow支援最好的程式語言應該是python(應該說大部分深度學習框架支援的最好的語言都是Python),tensorflow的底層說是C/C++編寫的,但是,感覺它對C/C++真的很不友好,有關Python的資料一查一大把,有關C/C++的一

    微信小遊戲 一筆畫完 完全

    目錄 基本思路 美食喵 1-135關 西瓜喵1-15關 藍莓喵16-30關 咖啡喵31-45關 番茄喵46-60關 豆沙喵61-75關 橙汁喵76-90關 紫薯關91-105關 拿鐵喵106-120關 奶茶喵135關 社會喵 136-270關 原諒

    Ubuntu下編輯並編譯執行c++程式

    一、使用vim編輯c++程式碼: vim hello.cpp 輸入如下程式碼: #include <iostream> using namespace std; int main() { cout<<"Hello world!"<<endl;

    C++筆記】Windows通過命令列編譯執行c程式 (轉載)

    1.準備 一臺具備c開發環境的Windows。 驗證方式,命令列輸入gcc -v,檢視是否輸出版本資訊。 gcc -v 1 2.寫程式 在E盤建一個資料夾C,在裡面建立一個Hello.c檔案,副檔名是c,內容如下: #include <stdio.h>

    BlackholeSkins-DOTA2,CSGO開箱網站完全

    找最好的dota2,csgo開箱網站,一定要上www.dota2sites.com BlackholeSkins是雙十一剛開的新dota2,csgo開箱網站,讓我們看看如何在該網站上玩開箱子吧。 點選訪問網站 首先網站現在僅支援qq登入,登入後儲存了登入資訊,再次登陸很方便。點選下圖的按鈕就可以QQ登陸

    分塊查詢演算法完全(原理、實現及時間複雜度)

    一般對於需要查詢的待查資料元素列表來說,如果很少變化或者幾乎不變,則我們完全可以通過排序把這個列表排好序以便我們以後查詢。但是對於經常增加資料元素的列表來說,要是每次增加資料都排序的話,那真的是有點太累人了。 所以之前我們分析過,對於幾乎不變的資料列表來說,排序之後使用二分查詢是很不錯的,但是對於經常變動的

    GitHub個人Blog完全

    Git個人網站完整攻略 當前越來越多的大牛轉戰GitHub的時候,我們也應該考慮搭建自己的一個Blog來記錄自己的學習和成長經歷了。 一則,作為未來的碼農是需要自己與國際,至少是與主流的程式碼託管相接觸的。 二則,我想自己在校的時光也許需要重新好好的珍惜一下來之不

    ClearCase完全(一):Base和UCM的前生後世

    ClearCase到底是幹嘛的? 通俗的我們可以認為是一款IBM出的原始碼管理工具。 ClearCase的四大功能? (版本管理+過程管理+工作空間管理+bulid管理)有個經典的圖,各個功能圖裡面說的很清楚了。 Base和UCM到底有什麼區別? Base 就是Clear

    Cozmo機器人脫離智慧手機使用的不完全

    使用模擬器視訊錄影連結: https://v.youku.com/v_show/id_XMzk4NjM4OTU4NA==.html 需要使用安卓模擬器: 連線成功後: 需要進行sdk開發和除錯,參考官網按如下步驟配置: 使用adb除錯: 在對應位置

    【VSCode】Ubuntu下VSCode編譯執行c++程式

    之前在Ubuntu下寫一些C++程式,一直找不到一個優(hao)雅(kan)的IDE,所以都是使用vim或Clion來寫。今天發現微軟的一款編輯器,介面好看,功能也挺好用的。 以下是我的一些安裝和配置方法: 1、官網下載地址: https://code.visuals