一般的方法都是直接在 NppExec 按下 Execute 時輸入 編譯器的位址 再來編譯

但是將 Notepad++ 帶到其他電腦後,那台沒裝 MinGW 編譯器時,就會變得很不方便

在此提供一個 簡單 的方法,讓你把 Notepad++ 和 MinGW 放在一起,可以存在 USB 內,到哪台電腦都可以 編譯!

以後把 Notepad++ 資料夾移動到哪都無所謂,只要用 Notepad++ 打開原始碼,按個 F6 編譯,就完成了!


Windows Only,

Single cpp file





相關文章 :

Notepad++ NppExec 輸出前置處理檔案



其他方式 :

1. 用 Sublime Text 來編譯 (Sublime Text 是和 Notepad++ 性質相似的編輯器) :
下載 Sublime Text 後,把 MinGW 資料夾放到 C:\ 資料夾下,在 系統變數  的 Path 值 原本字串後面增加 ;C:\MinGW\bin
使用 Sublime Text 時點 Tools -> Build 即可編譯 C/C++ Single cpp/Makefile




功能


1. 可以在 Notepad++ 中指定參數 (Arguments) 編譯完後 執行傳遞給程式

2. 可以在原始碼 的 資料夾 (Source file) 創一個文字文件 "debug_args.txt" 填入 參數,編譯完後傳遞給程式

3. 可以指定額外的 Compiler flags

4. 可以選擇要不要編譯完就 自動執行,或是按 Enter 才執行

5. 可以選擇要不要先 終止 舊的處理程序

6. 可以選擇編譯前要不要先 刪除舊檔案

7. 檔名和參數 可以有空格

8. 如果編譯失敗 不會執行程式





所需物件


(1) Notepad++ 和他的插件 NppExec

(2) TDM-GCC 編譯器 (比較推薦這個)

或是 MinGW

(3) NppExec 執行碼 (底下提供)

(4) 放在 MinGW 資料夾下的 "Compile.bat" 批次檔一個 (底下提供)





安裝 Notepad++ 插件 NppExec :

如果 Notepad++ 已經有裝 NppExec 那麼這步驟就 OK

沒裝的話,進入以上提供連結後 => 搜尋 NppExec 進入連結 => 再點連結 NppExec => 點最新版本 (例 : NppExec Plugin v0.4.2) => 看 Notepad++ 使用的是哪個版本 => Unicode 選 NppExec_042_dll_Unicode.zip , ASNI 選 NppExec_042_dll_ANSI.zip => 下載解壓 => 全部檔案放置到 Notepad++ 資料夾下的 \plugins\ 下



設置 MinGW 資料夾 :

(1) 如果電腦已經有裝 Dev C++ 或 CodeBlocks,可以直接把裡面的 MinGW 資料夾 放置在 Notepad++ 資料夾下 (Notepad++.exe 執行檔位置的資料夾)

(2) 沒有裝的話,點以上提供連結 TDM-GCC => Download => 選左上角的 Bundle Installer 點 exe 連結 => 下載安裝 => Create => 選擇 32bit 或 64bit => 目錄... => 安裝完成後,把安裝路徑的 MinGW 整個資料夾 複製/剪下,貼到 Notepad++ 資料夾下




NppExec 執行碼 (Compile C/C++) :




說明 :


打開 Notepad++ => Plugins => NppExec => Execute... (F6)

將以上執行碼貼到空白區域,可以點 Save... 取一個好聽的名字 (例 : Compile C/C++) 儲存,以後就變成一個類似 Script 很方便

*Tips: 如果 Notepad++ 中點 F6 無效,Notepad++ 點 Settings -> Shortcut Mapper... -> Plugin commands tab  看 F6 是不是被其他項搶走
可以把 Execute... 項目改成其他的快捷鍵



我這邊設了很多參數,是為了讓編譯更方便


bAutorun : 如果值是 1,那麼編譯完成後將會自動執行,而不會有 要按 Enter 才會執行的訊息

bKillOldProc : 如果值是 1,編譯前會先用 taskkill 把舊的處理程序砍掉 (必須用系統管理員權限執行 Notepad++)

bDeleteOldExe : 如果值是 1,會先刪除舊的輸出執行檔 (必須用系統管理員權限執行 Notepad++)


flags : 字串,必須有雙引號包住,傳遞給編譯器的額外參數 (Compiler flags),
預設是 "-Wall" 代表將所有警告訊息打開 (例如變數宣告了卻沒使用,編譯器就會警告你)

args : 字串,必須有雙引號包住,傳遞給執行程式使用的參數 (Arguments)



在編輯多重檔案時,傳遞給每個程式的參數都可能不同,要用同一個 Script 來執行不同參數的呼叫,

改來改去可能會發瘋,所以我又額外設計一個功能 :


如果在 Source file 的資料夾下建立一個文字文件 "debug_args.txt"

那麼其中的內容 (只有第一行的內容) 會 覆蓋(Override) 到 args 的參數,如此一來可以在不同資料夾進行不同 Arguments 傳遞呼叫,不用再用 cmd 慢慢打


同理,至於是編譯器參數 (Compiler flags) 時,則是在 Source file 的資料夾下建立一個文字文件 "debug_flags.txt"

那麼其中的內容 (只有第一行的內容) 會 覆蓋到 flags 的參數

可以利用這個檔案 include libraries,不過別忘了這是覆蓋的,所以最好在一開始加上 -Wall 然後再 -I ...



程式的任何路徑 (MinGW 的位置、原始碼的檔案位置) 都可以接受包含空白的字串,包括 Flags, Arguments 都可以輸入空格,不過在 NPP_EXEC 的執行碼內,記得參數要用雙引號包起來

雖然說檔名可以接受 空白,但是還是不能包含其他會干擾 NppExec 或 BAT 檔的符號,像是 (), ^, % 等都不行




Compile.bat  (放在 MinGW 資料夾下) 原始碼 :







說明 :


Notepad++ 資料夾下的 MinGW 資料夾 內新增一個 Compile.bat 內容如以上原始碼

程式編譯後將會 把同檔名的執行檔放到 原始碼的資料夾內



FAQ


(1) 如果要自訂 編譯器 的位置,該改哪些程式碼?

"Compile.bat" 程式碼第 15 行 

set compiler=%~dp0\bin\mingw32-g++.exe

將藍色的部分改成 編譯器 自訂的位置,%~dp0 是 bat 檔所在位置

例如想用 C:\MinGW\ 內的編譯器,就改成 set compiler=C:\MinGW\bin\mingw32-g++.exe


(2) 如果要自訂 Compile.bat 檔案的位置,該改哪些程式碼?

NppExec 執行碼 第 20 行

NPP_RUN "$(NPP_DIRECTORY)\MinGW\Compile.bat" $(dstName) "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(bAutorun)" "$(bKillOldProc)" "$(bDeleteOldFile)" $(flags) $(args)

將藍色部分 Compile.bat 改成自訂的位置,注意有用雙引號包起來,
$(NPP_DIRECTORY) 是 Notepad++ 的資料夾路徑

注意如果移動 這個 bat 檔的位置,也要注意一下會不會間接造成 bat檔 找不到 編譯器的位置,請參考 FAQ (1)


(3) 其他問題

請留言




編譯方法



▼ 打開 Notepad++ => Plugins => NppExec => Execute... (F6) => OK 進行編譯


NppExec test 1 cpp     



以上的程式碼 (C++ 語言) :

這程式碼是用來 顯示所有的呼叫參數 (Arguments),可以在 原始碼資料夾下 建一個 "debug_args.txt" 打上一些參數看看效果

#include <iostream>
using namespace std;

void PrintHelloWorld() {
    cout << "hello world" << endl;
}

void PrintArguments(int argc, char *args[]) {
    for (int i = 1; i < argc; ++i) {
        cout << "args[" << i << "] = '" << args[i] << "'" << endl;
    }
}

int main(int argc, char *args[]) {
    int foo = 0;

    PrintHelloWorld();
    PrintArguments(argc, args);

    cin.ignore();
    return 0;
}

 





▼ 編譯完成 (因為 Flags 使用 "-Wall" ,有一個未使用的變數 "foo" 而出現了警告訊息)

按下 Enter 後即可執行程式



NppExec compile bat   


Ebola

ebola777.pixnet.net

文章標籤
創作者介紹

Shawn's Blog

Shawn 發表在 痞客邦 PIXNET 留言(7) 人氣()


留言列表 (7)

發表留言
  • 訪客
  • 謝謝你~幫助很大
  • :)

    Shawn 於 2012/09/28 00:18 回覆

  • 午前天雨
  • 很謝謝你的教學分享
    但是我好像卡關了......

    第三步中的"debug_param.txt"和"debug_flags.txt"文件內容分別是什麼?
    還有這兩個檔案對於C初學者來說一定要有嗎?

    就麻煩大大解惑了(跪
  • debug_param.txt 和 debug_flags.txt 預設是不需要的
    這兩個文件的意思在於可以 覆蓋 預設的編譯參數

    如果檔案 不存在,那就用預設的參數 (param -> 呼叫程式的參數, flags -> 編譯的參數)
    如果檔案 存在,就用檔案內的文字來當作參數

    EDIT:
    最近一次改版後,debug_param.txt 改為 debug_args.txt

    Shawn 於 2013/01/17 21:22 回覆

  • 訪客
  • 您好
    我照著此教學做了之後(所有東西都有安裝),卻出現- the specified file was not found錯誤,不知何解?
    以下是console的訊息,可否請您幫我看一下

    SET: bAutorun = 0
    $(BAUTORUN) = 0
    SET: bKillOldProc = 0
    $(BKILLOLDPROC) = 0
    SET: bDeleteOldFile = 0
    $(BDELETEOLDFILE) = 0
    SET: flags = "-Wall"
    $(FLAGS) = "-Wall"
    SET: args = ""
    $(ARGS) = ""
    SET: dstName = "aa.exe"
    $(DSTNAME) = "aa.exe"
    NPP_SAVE: C:\Users\www\Downloads\Notepad++\aa.c
    Call bat file to compile and execute.....
    NPP_RUN: "C:\Users\www\Downloads\Notepad++\MinGW\[BAT] Compile.bat" "aa.exe" "C:\Users\www\Downloads\Notepad++\aa.c" "C:\Users\www\Downloads\Notepad++" "0" "0" "0" "-Wall" ""
    - the specified file was not found

  • 訪客
  • 嘿我已經解決了- the specified file was not found
    主要是NPPExec裡面的.bat檔的路徑和.bat檔裡面compiler的路徑需要自行修改
    我建議可以在文章中提醒一下^^

    但又發現一個問題,那就是
    bKillOldProc : 如果值是 1,編譯前會先用 taskkill 把舊的處理程序砍掉

    bDeleteOldExe : 如果值是 1,會先刪除舊的輸出執行檔

    這兩個指令會出現"存取被拒" (Win7)
    我是把Notepad++設成管理員權限執行才能解決
  • 有,文章內有寫 MinGW 資料夾放在 Notepad++ 下,BAT 檔 "[BAT] Compile.bat" 放在 MinGW 資料夾下

    然後卻沒有寫清楚 如何修改成自訂的方式

    感謝提醒,文章已經加上了 FAQ 和 Notepad++ 需要管理員權限才能執行 bKillOldProc & bDeleteOldExe 的提示

    Shawn 於 2013/01/21 18:23 回覆

  • 訪客
  • 您好,最近使用您的方法在npp上編譯,但卻始終都是..


    * [Compiler path] "G:\\MinGW\bin\mingw32-g++.exe"
    * [Source path] "G:\new 2.c"
    * [Output path] "G:\\new 2.exe"
    * [Flags] "-Wall"
    * [Arguments] NULL

    Compile "new 2.exe"...

    ========== Messages from compiler ==========
    系統找不到指定的路徑。
    ____________________________________________

    不知道這樣的錯誤訊息代表哪裡有問題呢,謝謝
  • 系統找不到指定的路徑 指的是
    * [Compiler path] "G:\\MinGW\bin\mingw32-g++.exe"
    系統找不到以上編譯器的路徑

    注意本文的預設方式是把 MinGW 放在與 notepad++.exe 同一個資料夾
    而 bat 檔則是放在這個 MinGW 資料夾下

    如需修改 編譯器位置 或 bat 檔位置請看文章中的 FAQ

    Shawn 於 2013/09/20 20:32 回覆

  • 小狼
  • 感謝您的分享,這篇讓我學到許多!

    另外建議預設的[BAT] Compile.bat 程式碼第 15 行
    set compiler=%cd%\MinGW\bin\mingw32-g++.exe
    將%cd%更改為%~dp0,並且去掉\MinGW
    也就是變成
    set compiler=%~dp0\bin\mingw32-g++.exe

    %~dp0 會讀取bat檔所在的目錄
    %cd% 則是讀取cpp所存放的路徑(通常應該會放在各種不同路徑,導致抓不到g++)
    我是參考這篇才懂 http://blog.csdn.net/shenyunsese/article/details/17024631
  • 謝謝指正

    已將 %cd% 改成 %~dp0,
    而且將 [BAT] Compile.bat 改成較簡潔的名稱 Compile.bat

    Shawn 於 2014/10/21 17:29 回覆

  • rtstasur925
  • 你好,感謝教學,正需要這方面的技術時GOOGLE到了這篇文章:D
    不過後來發現,在電腦上把步驟弄完之後
    可以完成編譯是因為安裝完TDM-GCC後
    系統會幫我們設定環境變數,把MinGW的路徑加入進去的關係
    要是我把MinGW的路徑從環境變數裡刪掉的話
    編譯會失敗並出現錯誤訊息
    "無法啟動程式,因為您的電腦遺失 libgmp-10.dll。請嘗試重新安裝以修正這個問題。"
    這樣把notepad++放進usb拿到別台沒有MinGW的電腦的話
    一樣也是不能編譯的
    是否我還漏掉什麼步驟了呢?

    雖然後來我有私下研究出補救的方法
    但是這篇已是2013的文章
    不知道Shawn大還會不會回來看回覆
    會的話,想跟您一起討論:)
找更多相關文章與討論