G++編譯連結的那些事!G++的特殊使用方法[常用]

海之戀SF發表於2020-04-19

語言 CPP

前言

  雖然 VSCodeC++ 編輯器非常受大家的歡迎,無論是大佬還是小白都說對其愛不釋手...
  我...用了一段時間後發現實在是麻煩,配置往往花費我大量時間。可以說真的是吃力不討好(個人觀點,不代表其他人)!所以,用了一段時間後我又默默的用起了自己的 HBuilderX !
  淦! HBuilderX 不是主力前端嗎?額~是的,CPP在這裡不是很受寵,但沒關係啊(主要是真的好用)!CPP的基本語法還是支援的,再加上自己完善了一下“自定義CPP程式碼塊”後更是如虎添翼!HBuilderX NB!
  不過,有個最大的問題就是編譯連結!因為 HBuilderX 本身並不是為CPP開發的,所以根本不會有這一功能,更苦的是連個外掛都沒得...一切都只能靠命令列!
  經過一段時間的摸索,最後打算寫一篇總結。力求簡潔、明瞭!
  不定期更新!
  提示:檔案結構如下

+-- demo.cpp
|
+-- demo.ico
|
+-- demo.rc

第一章 - 靜態編譯

手動編譯:

  1. 開啟 CMD 命令視窗;
  2. 執行命令 g++ -c demo.cpp -o step_one.o
  3. 執行命令 ar -cr libstep_two.a step_one.o
  4. 執行命令 g++ demo.cpp -L. -Istep_two -static -o release.exe
  5. 得到 release.exe 應用程式。

註釋

  1. 原理我不多說了,有興趣的自行了解!力求簡潔、明瞭!
  2. step_one 與 step_two 字元可替換;
  3. release.exe 為輸出應用程式的名字;

批處理指令碼:

::使用方法 - 直接將 demo.cpp 託入批處理執行即可,也可使用 CMD 命令傳引數的方式執行。
@echo off
set start=%1
:get_o
if exist %1 (g++ -c %start% -o step_one.o) else (goto get_o)
:get_a
if exist .\o.o (ar -cr libstep_two.a step_one.o) else (goto get_a)
:get_exe
if exist .\liba.a (g++ %start% -L. -Istep_two -static -o release) else (goto get_exe)
:del
del DEL /F /A /Q step_one.o
del DEL /F /A /Q libstep_two.a
call release.exe
:end

第二章 - 自定義程式 ICO

手動操作

  1. 在 demo.rc 檔案中新增 id ICON "path/to/my.ico"
  2. 執行命令 windres demo.rc -O coff -o demo.res
  3. 執行命令 g++ demo.cpp demo.res -o release.exe
  4. 得到帶 ICO 的應用程式。

註釋

  1. 原理大致為: 資原始檔(.res) + 原始檔(.cpp) =編譯=> 帶資源的應用程式(.exe);
  2. 第三步也可以使用靜態編譯:g++ -c demo.cpp -o step_one.o -> ar -cr libstep_two.a step_one.o -> g++ demo.cpp demo.res -L. -Istep_two -static -o release.exe

批處理指令碼

還沒寫

第三章 - 新增版本資訊

手動操作

  1. 在 demo.rc 檔案中新增
1 VERSIONINFO
FILEVERSION    1,0,0,0 // 檔案版本
PRODUCTVERSION  1,0,0,0
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904E4" // 語言(修改前四位)
   BEGIN
     VALUE "CompanyName", "公司名"
     VALUE "FileDescription", "檔案描述"
     VALUE "FileVersion", "1.0"
     VALUE "InternalName", "內部名稱"
     VALUE "LegalCopyright", "版權"
     VALUE "OriginalFilename", "原始檔名"
     VALUE "ProductName", "產品名稱"
     VALUE "ProductVersion", "產品版本"
   END
  END

  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809, 1252 // 翻譯
  END
END
  1. 執行命令 windres demo.rc -O coff -o demo.res
  2. 執行命令 g++ demo.cpp demo.res -o release.exe
  3. 得到帶版本資訊的應用程式。

註釋

  1. .RC 檔案使用的是微軟定義的指令碼語言;
  2. 更改語言時需要同時更改 “語言” 和 “翻譯” 兩處內容。“語言” 行("080904E4")修改前四個數字;“翻譯” 行(0x809)修改後三位數字。
    • Example: 簡體中文的 langID 為 0x0804
      1. 修改“語言”行前四位為 “0804”;
      2. 修改“翻譯”行後三位為 “804”;
      3. 修改“語言”資訊為“簡體中文”。
  3. .RC資原始檔詳情請參考MSDN

原創說明

本文原作者:SeaFever
轉載請留言!
原文連結:https://www.cnblogs.com/seafever/p/12660507.html

相關文章