一般而言,對於 c++ 程式編譯有以下4個階段:
參考《an introduction to gcc》gcc 最開始的時候是 gnu c compiler,就是乙個 c 編譯器。但是後來因為這個專案裡邊整合了更多其他不同語言的編譯器, gcc 就代表 the gnu compiler collection,所以表示一堆編譯器的合集。g++ 則是gcc的 c++ 編譯器。
現在呼叫 gcc 的時候,已經不是當初那個 c 語言編譯器了,更確切地說它是乙個驅動程式,根據**的字尾名來判斷呼叫 c 編譯器還是 c++ 編譯器(g++)。即**字尾是 .c,則呼叫 c 編譯器和 linker 去鏈結 c 的 library,**字尾是 .cpp,則呼叫 g++ 編譯器,但是這裡 gcc 不會自動和 c++ 庫鏈結。
$ gcc *.o -lstdc++
$ ls
a.out factory.h main.cpp product.cpp product.o
factory.cpp factory.o main.o product.h
$ ./a.out
concrete facotry
concrete product...
$ g++ *.o
$ ls
a.out factory.h main.cpp product.cpp product.o
factory.cpp factory.o main.o product.h
$ ./a.out
concrete facotry
concrete product...
綜上,可直接使用 g++ 編譯鏈結 c++ 程式生成可執行檔案
$ g++ *.cpp
$ ls
a.out factory.cpp factory.h main.cpp product.cpp product.h
$ ./a.out
concrete facotry
concrete product...
include 包含檔案在編譯的時候使用,gcc 搜尋標頭檔案路徑的順序:
當前目錄(#include 「」 方式會搜尋當前目錄,#include <> 方式不會搜尋當前目錄)
-i 選項指定的目錄
gcc 環境變數cplus_include_path指示的目錄(c 程式使用的是c_include_path)
gcc 的預設目錄
/usr/local/include
/usr/include
/usr/lib/x86_64-linux-gnu/5.4
.0/include
gcc 的預設目錄,不是由 $path 環境變數指定的,而是由 g++ 的配置 prefix 指定。
用於編譯生成動態庫。
cl.exe 和 link.exe 分別是 visual studio ide 中的編譯器和鏈結器。
例:windows下命令中使用路徑時,注意特殊字元要使用轉義字元」\」,如下路徑中包含\,空格和括號,前面均加轉義符」\」,或者將路徑用引號括起來。
gitbash視窗:
$ cl *.cpp -c -ehsc -i c:\\program\ files\
\(x86\)
\\microsoft\ visual\ studio\ 14.0\\vc\\include -i c:\\program\ files\
\(x86\)
\\windows\ kits\\10\\include\\10.0.10240.0\\ucrt
# or
$ cl *.cpp -c -ehsc -i "c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt" -i "c:\program files (x86)\microsoft visual studio 14.0\vc
\include"
usage: link
[options]
[files]
[@commandfile]
例:
windows cmd 視窗(bash下測試不過):
$ link *.obj /libpath:"c:\program files (x86)\microsoft visual studio 14.0\vc
\lib" /libpath:"c:\program files (x86)\microsoft sdks\windows
\v7.1a\lib" /libpath:"c:\program files (x86)\windows kits\10\lib\10.0.10240.0\ucrt
\x86" /out:fac.exe
參考msdn除非指定 -c 選項,否則 cl.exe 會自動呼叫 link.exe 。以下為 cl 中影響鏈結的常用功能(注意當引數有指定輸出檔案時,要帶冒號:):
參考msdncl 和 link 用到的環境變數有:
link.exe
tmp: 鏈結時尋找 omf 或 .res 檔案時,會從這個路徑中尋找。
echo off
setx -m win_kit "c:\program files (x86)\windows kits"
setx -m win_sdk "c:\program files (x86)\microsoft sdks"
setx -m vs_install_dir "c:\program files (x86)\microsoft visual studio 14.0"
setx -m microsoft_sdk "c:\program files (x86)\microsoft sdks"
setx -m path "%vs_install_dir%\vc\bin;%path%"
rem include
rem -------
setx -m include "%vs_install_dir%\vc\include;%vs_install_dir%\vc\atlmfc\include;%win_kit%\10\include\10.0.10240.0\ucrt"
rem lib
rem ---
setx -m lib "%vs_install_dir%\vc\lib;%vs_install_dir%\vc\atlmfc\lib;%microsoft_sdk%\windows\v7.1a\lib;%win_kit%\10\lib\10.0.10240.0\ucrt\x86;%win_kit%\10\lib\10.0.10240.0\ucrt\x64"
rem libpath
rem -------
setx -m libpath "%vs_install_dir%\vc\lib;%vs_install_dir%\vc\atlmfc\lib;%win_kit%\10\lib\10.0.10240.0\ucrt\x86;%microsoft_sdk%\10\lib\10.0.10240.0\ucrt\x86"
pause
環境變數設定好後,即可通過 cl 在命令列一步生成 c++ 的可執行檔案,例
$ cd /e/program/designpattern/factory/factory
$ ls *.cpp
factory.cpp main.cpp product.cpp
$ cl *.cpp -ehcs -fe: fac
microsoft (r) c/c++ optimizing compiler version 19.00
.24215
.1 for x86
factory.cpp
main.cpp
product.cpp
generating code...
microsoft (r) incremental linker version 14.00
.24215
.1/out:fac.exe
factory.obj
main.obj
product.obj
$ ls *.cpp *.obj *.exe
fac.exe* factory.cpp factory.obj main.cpp main.obj product.cpp product.obj
$ ./fac.exe
concrete facotry
concrete product...
命令列編譯Solution
c windows devenv.com microsoft r 開發環境 7.10.3077 版。c microsoft corp 1984 2001 保留所有權利。用法 devenv solutionfile projectfile anyfile.ext switches 可以呼叫 deven...
命令列編譯C C
命令列編譯c c 程式的方法 1.先用記事本寫c c 如下 includeusing namespace std int main 儲存在任意資料夾下,以d盤為例,儲存為d a.cpp 注意 字尾名改為.cpp,c語言則為.c 2.用記事本寫批處理檔案 假設vc6.0安裝在d program fil...
less 命令列編譯
用命令列編譯,需要先把環境配置好。環境配置教程 less 環境搭建 第1步 win r,輸入cmd 第2步 進入你存放less的位置。首先是先選擇碟符,比如 h 選擇碟符後,後面要加冒號。然後 用cd命令,進入對應目錄 cd practice less less 第3步 用less的命令進行編譯 l...