模仿Visual Studio————命令行編譯C/C++程序

 

VS構建工具介紹

我們都知道C/C++源代碼要生成可執行的.exe程序,需要經過預處理、編譯、鏈接的過程。你在VS工具中只需要選擇菜單Build或按一下F可以編譯生成我們的可執行程序exe文件,其實IDE幫我隱藏了好多的具體細節。

打開VS2010安裝目錄,打開VC\bin可以看到一系列的可執行程序.exe和批處理文件,這些就是VS2010構建、編譯、鏈接時要用到的工具。看一下幾個主要的工具: 

cl.exe:編譯程序 
link.exe:鏈接程序 
lib.exe:加載lib庫的程序 
nmake.exe:用makefile進行構建、編譯的工具
dumpbin.exe: 查看dll或exe的依賴庫

命令行編譯程序 

此處有兩種方法一種是通過配置系統環境變量然後在系統命令窗口執行,另一種是在vs中直接打開visual studio 命令提示符

 

其實第二種方法就是通過第一種方法來的(執行了vsvars32.bat)有興趣可以去了解一下。


CL.EXE測試

#include <iostream>
#include <stdio.h>
int main()
{
    std::cout << "This is a native C++ program." << std::endl;
    printf("printf: Hello World");
    return 0;
}

編譯執行結果:

在以上的編譯過程中我們只用了cl的編譯命令就幫我們最終的可執行文件main.exe,這是因爲cl.exe程序在編譯時自己會去調用link.exe、lib.exe等程序。

以上只是最簡單所有都是採用默認的編譯選項,實際工作中我們需要根據不同場景選擇不同編譯選項來編譯我們的代碼,下面對cl.exe的使用做簡單介紹,直接在命令窗口輸入cl會顯示用法:

輸入cl  /?或者輸入cl -help(-help)則會顯示所有的編譯選項及具體含義:

如果不明白可以和vs的屬性設置對照了來看,在屬性->配置屬性->c/c++->命令行是包含你設置的編譯選項集合和用法。

LINK.EXE測試

我們知道通過cl.exe編譯後產生的是一個個的obj文件,此時並沒有生成我們的可執行文件(此處只針對windows下,後綴名可指定文件類型),如果要生成可執行文件就必須通過鏈接器將所有obj和lib等文件鏈接起來生成我們的可執行程序。

將前面的程序稍作修改,添加test.cpp文件,做一個小測試。

main.cpp

#include <iostream>
#include <stdio.h>
#include "test.h"
int main()
{
    test1();
    test2();
    std::cout << "This is a native C++ program." << std::endl;
    printf("printf: Hello World");
    return 0;
}

test.cpp

#include"test.h"
#include <iostream>

void test1()
{
std::cout<<"test1"<<std::endl;
}

void test2()
{
std::cout<<"test2"<< std::endl;
}

通過cl.exe編譯生成main.obj和test.obj文件(此時需要指定/c編譯選項告訴編譯器只要給我生成obj目標文件即可不要鏈接),然後調用link.exe將他們鏈接成一個可執行程序main.exe,生成的可執行文件名字可通過/out:"helloworld.exe"修改。

鏈接靜態庫、動態庫,此處通過指定鏈接運行時庫來測試,默認鏈接的是靜態運行時庫libcmt.lib,我們來測試一下,此處我們指定鏈接動態運行時庫msvcrt.lib

我們發現會出現大量鏈接錯誤2005,這是因爲msvcrt.lib和libcmt.lib的實現是一樣的所以兩個都鏈接就會出現重定義的錯誤(這裏其實就是我們在編譯器裏選擇MT、MTd、MD、MDd等鏈接方式後鏈接的不同選項,有興趣的可以去了解一下這個單獨都可以講一章此處就不在這裏詳細介紹),看上面截圖中黃色方框中我們可以看到默認的庫是libcmt.lib證明上面說的是對的,從上面的測試我們還應該認識到一點就是在我們程序開發中各個庫或者模塊應該統一運行時庫否則會出現error 2005井噴,那麼此處我們應該怎麼辦呢?第一就是使用默認的libcmt.lib,第二使用鏈接選項/NODEFAULTLIB來禁用默認鏈接庫然後再指定我們想要鏈接的庫。

此時可以正常鏈接成功生成可執行程序helloworld.exe

 通常我們生成的程序爲了方便調試都會提供一個pdb文件,通過前面測試會發現雖然我們生成了可執行文件但是並沒有生成對應的pdb文件,那麼通過命令行怎麼生成呢?查看命令link查看鏈接選項在其中找到一個/DEBUG選擇,在鏈接時加入此選項就會生成對應的pdb文件,可通過/pdb:"helloworld.pdb"來設置生成pdb的名稱。

對應的vs中的設置是 屬性->配置屬性->鏈接器->調試->生成調試信息

同樣的如果對於一些選項用法不明瞭可以參照vs來測試使用,在鏈接器的命令行中包含你設置的鏈接選項用法

其他

dumpbin可以用來查看exe,lib,dll,obj文件的依賴項,導入導出函數等,dumpbin /dependents 文件名 查看依賴庫

lib.exe可把def文件生成lib文件,舉個列子:

lib /out:F:\CC\def\sqlite3.lib /MACHINE:X64 /DEF:F:\CC\def\sqlite3.def

本文是作爲我學習筆記來記錄,如有錯誤請指正,不喜勿噴。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章