1. 程式人生 > >C++標頭檔案和原始檔的關係以及makefile檔案

C++標頭檔案和原始檔的關係以及makefile檔案

背景

因為函式之間需要相互引用,寫入一個檔案顯得雜亂。寫入不同檔案,引用和編譯也很麻煩。故用標頭檔案。

規則

標頭檔案的格式:

#ifndef <標頭檔案的名稱>
#define <標頭檔案的名稱>
<定義的函式>
#endif

原始檔的格式:
對於實現標頭檔案函式的原始檔,需要引用其實現的標頭檔案。
對於需要使用其他原始檔函式的原始檔,也需要引用標頭檔案。

對於格式:
當原始檔和標頭檔案不在一個資料夾裡的時候,路徑的寫法是:../表示父目錄。

Makefile檔案

main : bin/main.o bin/select.o
bin/bubble_sort.o bin/util.o g++ bin/main.o bin/select.o bin/bubble_sort.o bin/util.o -o main bin/main.o : src/main.cpp include/select.h g++ -c src/main.cpp -o bin/main.o bin/select.o : src/select.cpp include/sort.h include/select.h include/util.h g++ -c src/select.cpp -o bin/select.o bin/bubble_sort.o
: src/bubble_sort.cpp include/sort.h include/util.h include/select.h g++ -c src/bubble_sort.cpp -o bin/bubble_sort.o bin/util.o : src/util.cpp include/sort.h g++ -c src/util.cpp -o bin/util.o

其程式碼檔案在這裡
但是還存在一些疑問,但是不能卡在這裡。所以記錄下疑問,待以後解決(也希望如果有人看見了能點撥一二):
Q1. 對於g++ -o,-c等這些命令,檔名的位置有什麼規則。也就是那些位置代表已有的檔案,哪些位置代表要生成的目標檔案。比如:

#1
g++ -c src/main.cpp -o bin/main.o
g++ -c -o src/main.cpp bin/main.o

上面兩條有什麼不同麼?

Q2. 查閱資料後,編譯分為預處理 –>生成組合語言–>轉成機器語言–> 連結成可執行檔案。那為什麼上述的makefile沒有這些步驟似乎也能成功得到可執行檔案?是因為有預設的步驟省略了麼?(因為我的makefile是網上下載再自行修改的,並且對與makefile是純小白)

參考

相關推薦

C++檔案原始檔關係以及makefile檔案

背景 因為函式之間需要相互引用,寫入一個檔案顯得雜亂。寫入不同檔案,引用和編譯也很麻煩。故用標頭檔案。 規則 標頭檔案的格式: #ifndef <標頭檔案的名稱> #define <標頭檔案的名稱> <定義的函式&g

【Hibernate框架學習】:Hibernate進階之詳解Hibernate配置檔案物件關係對映配置檔案

       Hibernate核心配置檔案               我們先來看一個比較常見的hibernate.cfg.xml配置檔案: <!DOCTYPE hibernate-confi

C語言中,檔案原始檔關係(轉)

//a.h void foo(); //a.c #include "a.h"   //我的問題出來了:這句話是要,還是不要? void foo() {      return; } //main.c #include "a.h" int main(int argc

C語言中,檔案的作用,檔案原始檔關係(轉)

簡單的說其實要理解C檔案與標頭檔案(即.h)有什麼不同之處,首先需要弄明白編譯器的工作過程,一般說來編譯器會做以下幾個過程: 1.預處理階段  2.詞法與語法分析階段  3.編譯階段,首先編譯成純彙編語句,再將之彙編成跟CPU相關的二進位制碼,生成各個目標檔案 (.obj檔案) 4.連線階段,將各個目標檔

C++中為什麼要檔案原始檔分開寫呢?

對c&c++程式來說,基本上來說都是要把原始檔和標頭檔案分別編寫。一般都是代表一個基本功能的原始檔引用相應的標頭檔案。 一個 相關功能的模組可能有若干對原始檔和標頭檔案組成。這是基於元件程式設計的核心。 在我看來,他的好處是巨大的,是java不可比擬的,也是

C++中的檔案原始檔:如何寫檔案

通常,在一個C++程式中,只包含兩類檔案——.cpp檔案和.h檔案。其中,.cpp檔案被稱作C++原始檔,裡面放的都是C++的原始碼;而.h檔案則被稱作C++標頭檔案,裡面放的也是C++的原始碼。 C+ +語言支援“分別編譯”(separate compilation)。也就是說,一個程式所有的內容,可以分成

C++ 檔案原始檔的解釋

標頭檔案:.h 原始檔:.cpp 原始檔寫函式的定義, 標頭檔案用於寫函式的宣告,包括類裡面的成員和方法的宣告、函式原型、#define常數等,但一般來說不寫出具體的實現,除了宣告也有一些例外,不如static這種,或者只在該函式域起作用的,不過多解釋 在寫標頭檔案時需要

C++檔案用還是“” 以及 要加.h還是不加 的問題

1.C++標頭檔案用<>包含還是” “? 答:用<>包含,編譯器會先在系統目錄下搜尋; 用” ” 包含,編譯器會先在使用者目錄下搜尋。 所以,如果使用系統標準庫,要使用<>來包含標頭檔案;使用自定義標頭檔案用” “包含最好。 ** 否則有時候會找不

檔案原始檔工程構建CMakeLists寫法

1.最簡單的CMakeLists.txt如下,只有一個原始檔: cmake_minimum_required (VERSION 2.6) #版本要求 project (Tutorial) #工程名稱 add_executable(

C++ 基礎(三)C++檔案原始檔的使用方法 舉例

看完這篇文章,你就知道怎麼用標頭檔案和原始檔了 http://www.cnblogs.com/fenghuan/p/4794514.html 標頭檔案:常量、變數、函式、類的宣告 原始檔:變數的定義和函式的實現 步驟一、先建立標頭檔案 #ifndef CIRCLE_H #defi

可否把模板的檔案原始檔分開編譯

    嚴格意義上說,不行,不過可以通過巧妙的手段解決這問題。//-------------test.h----------------// template<class T> class A { public: void f(); // 這裡只是個宣告

linux常用環境變數c/c++檔案/庫路徑環境變數

環境變數設定 /etc/profile:在登入時,作業系統定製使用者環境時使用的第一個檔案,此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行。並從/etc/profile.d目錄的配置檔案中搜集shell的設定。 /etc/bashrc:為每一個執行b

C++ 檔案順序隱含依賴

今天編寫一個程式,拷貝另外一個檔案的標頭檔案時,沒有注意標頭檔案之間的內在依賴關係,導致編譯出錯,浪費了不少時間去定位和分析,才發現是標頭檔案順序不對導致的編譯問題,這也給自己以後編寫可靠程式碼時提供了一個主意項,準備參考google C++程式設計風格的標頭檔案順序。

C/C++ 檔案以及庫的搜尋路徑

關鍵點: 1. #include <...>  不會搜尋當前目錄                 2. 使用 -I 引數指定的標頭檔案路徑僅次於 搜尋當前路徑。                3.  gcc -E -v  可以輸出標頭檔案路徑搜尋過程

C++檔案的重定義問題以及檔案互相包含問題

  有的人將重複編譯,重複包含與重複定義弄混,比如:定義一個類,在例項化它之前並不產生記憶體開銷;這與基本型別有所區別。 明明在標頭檔案使用了#pragma once;#ifndef...#defi

C++ 檔案.h 原始檔.cpp

一、C++編譯模式 通常,在一個C++程式中,只包含兩類檔案——.cpp檔案和.h檔案。 其中,.cpp檔案被稱作C++原始檔,裡面放的都是C++的原始碼;而.h檔案則被稱作C++標頭檔案,裡面放的也是C++的原始碼。 C+ +語言

C ++檔案的十大錯誤,如何解決這些問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++檔案algorithm的reverse函式

reverse(beg,end) reverse()會將區間[beg,end)內的元素全部逆序;  #include<stdio.h> #include<iostream> #include<algorithm> using namespac

c/c++檔案引用順序

 http://www.cnblogs.com/clever101/archive/2011/08/21/2147892.html     一.《Google C++ 程式設計風格指南》裡的觀點       &

C++檔案引用模板

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath&g