命令列編譯C (Linux下 Windows下)

2021-08-09 07:40:34 字數 4484 閱讀 7585

一般而言,對於 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 中影響鏈結的常用功能(注意當引數有指定輸出檔案時,要帶冒號:):

參考msdn

cl 和 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...