c語言頭文件和源文件不在同一個目錄


http://www.cnblogs.com/ShaneZhang/archive/2013/05/20/3088688.html

 

從工程上講,頭文件的文件名應該與對應的源文件名相同便於維護,如果頭文件中包含了多個源文件中的定義或聲明,則應該按源文件分組布局頭文件中的代碼,並且通過注釋注明每組所在的源文件。當一個工程的文件較多時應該將源文件與頭文件分開目錄存放,一般頭文件存放在include或inc目錄下,而源文件存放在source或src目錄下,根據經驗,一個工程的文件數超過30個時應該將源文件與頭文件分開存放,當文件較少時直接放到同一目錄即可。

其實,C++標准中也沒有確定這兩種方式搜索文件filepath的順序,而是由編譯器的實現確定,其區別就是如果編譯器按照第二種形式定義的順序搜索文件filepath失敗或者不支持這種方式時,將其替換為第一種順序再進行搜索。

而實際上,一般來講第一種方式都是先搜索編譯器的系統目錄,而第二種方式則是以被編譯的頭文件所在目錄為當前目錄進行搜索,如果搜索失敗再在系統頭文件里搜索。這兩種方式從本質上講沒有什么區別,但當我們自己的程序文件與系統頭文件重名時,用后者就會先搜到我們的頭文件而不是系統的。但無論如何,與系統頭文件重名都不是一個好習慣,一不小心就可能帶來不必要的麻煩,當我們自己編寫程序庫時,最好把它放入一個目錄里,不把這個目錄直接添加到編譯器的頭文件搜索路徑中(如gcc的-I, visual c++的/I選項等,其實在UNIX/Linux平台的編譯器一般都是-I選項),而是添加到上一級目錄,而在我們的源文件中引用該頭文件時就包含該目錄名,這樣不容易造成沖突。

例如,我們創建了一個程序庫叫mylib,其中一個頭文件是strutil.hpp,我們可以創建一個/home/user/project/src/mylib目錄,然后把strutil.hpp放進去,然后把 /home/user/project/src添加到編譯選項里:

gcc -I/home/user/project/src

這樣,在我們的源程序中可以這樣引用strutil.hpp文件:

#include “mylib/strutil.hpp”

通過顯示的目錄名引用頭文件就不容易產生沖突,不容易使我們自己的頭文件與系統頭文件產生混淆。

當然,從代碼邏輯上我們還有另外一種解決沖突的方案,那就是命名空間,詳見第[?]節。

 

http://blog.sina.com.cn/s/blog_6e0693f70100so42.html

 

VS做的很智能,一個F7就完成了預處理、編譯、鏈接的所有工作。但是當工程比較大,使用的文件模塊比較多, 一旦出現編譯錯誤定位問題時就比較困難。因此,有時候需要對每個模塊單獨編譯,就像Linux下編寫的 makefile文件一下,分別編譯每一個.o目標文件然后再鏈接成為一個.exe可執行程序。總結下在VS下使用命令行分別編譯程序的方法。

在dos下編譯的前提環境配置要求:

1.找到vs的cl.exe所在目錄,在vs2010為F:\visual 2010\VC\bin,可參考。

2.點擊“我的電腦”進行環境變量的配置,找到"path"變量加分號后加入剛才的路徑。

3.重新運行cmd開啟新的命令窗口,輸入cl檢查path設置是否生效。(只需配置一次即可,以后再次運行的時候不用再運行此命令)。

4.輸入vcvars32,這條命令是運行同路徑下的vcvars32.bat設置它的環境變量。

5.輸入cl hello.cpp即可正常編譯。

 

 

 

下面總結一些常用的命令:

通過快捷方式Visual Studio Command Prompt (2010)可以打開VS的命令行界面。

(1) 在命令行提示符窗口中輸入:cl  /?   或者   cl -help 可以查看cl所有的命令選項。

(2) 在默認情況下cl編譯完后會自動調用link進行鏈接,可以使用/c選項阻止鏈接。

(3) 編譯一個文件命令:cl /FeMyapp 1.cpp,然后輸入程序名Myapp執行程序。(注意1.h在本地,可以通過/I選 項指定頭文件路徑)

(4) 編譯多個文件命令:cl /FeMyapp 1.cpp 2.cpp 3.cpp,然后輸入程序名Myapp執行程序。

(5) 只輸出 .i 預編譯文件命令:cl /FiA /P A.cpp,然后會生成 A.i 預編譯文件。這個方法類似Linux下的  gcc -E A.cpp -o A.i 命令。此命令的主要作用是用於檢查未定義情況的錯誤。 

(6) 只輸出 .o 目標文件命令:cl /FoA /c A.cpp,然后會生成 A.obj 目標文件,類似Linux下的 .o 文件。注 意這里應該帶上 /c 選項,原因見(2),即默認情況下,cl會自動對編譯好的目標文件進行鏈接,如果此時,所 編譯的目標文件引用了其他目標文件中的符號的話,就會出現鏈接錯誤。 

 

參考網址 :http://zhidao.baidu.com/question/184905864


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM