1. 程式人生 > >linux中makefile設定路徑的問題

linux中makefile設定路徑的問題

開始接觸Makefile已經有好幾個月了,最近想好好學習學習

但是一個簡單的問題就卡殼了很簡單的一個問題

|-- Makefile
|-- include
|   `-- hello.h
`-- src
    |-- hello.cpp
    `-- main.cp

首先是Makefile 檔案和include資料夾還有src資料夾在同一個目錄下

標頭檔案hello.h在include目錄下

原始檔main.cpp和hello.cpp在src目錄下

////////////////////////////////

hello.h:

#ifndef _HELLO_H__

#define _HELLO_H__

void hello();

#endif

///////////////////////////

hello.cpp:

#include<iostream>

#include"hello.h"

using namespace std;

void hello()

{

        cout<<"Hello world"<<endl;

}

/////////////////////////////

main.cpp:

#include<iostream>

#include"hello.h"

using namespace std;

int main()

{

          hello();

          return 0;

}

/////////////////////////////////

Makfile:

#VPATH=include:src
vpath %.cpp src
vpath %.h include
test:main.o hello.o
g++ -o [email protected] main.o hello.o
main.o:main.cpp hello.h
g++ -c $< -Iinclude
hello.o:hello.cpp hello.h
g++ -c $< -Iinclude
.PHONY:clean
clean:
-rm test hello.o

//////////////////////////////////

因為Makefile、hello.h hello.cpp main.cpp沒有在同一個路徑,所以要考慮路徑的問題

同時,路徑也有兩種,一種是針對Makefile來說在執行make命令的時候,要尋找目標檔案和依賴檔案的路徑

另一個就是原始檔所要包含的標頭檔案等相關檔案的路徑。

對於第一種來說,Makefile 提供了兩種方式,一種是設定全域性訪問路徑VAPTH:即在執行make命令時可以從該路徑中查詢目標和依賴make可識別一個特殊變數“VPATH”。通過變數“VPATH”可以指定依賴檔案的搜尋路徑,
在規則的依賴檔案在當前目錄不存在時,make會在此變數所指定的目錄下去尋找這些依賴檔案。
一般我們都是用此變數來說明規則中的依賴檔案的搜尋路徑。其實“VPATH”變數所指定的是
首先說明一下makefile的執行步驟:

1、讀入所有的Makefile。
2、讀入被include的其它Makefile。
3、初始化檔案中的變數。
4、推導隱晦規則,並分析所有規則。
5、為所有的目標檔案建立依賴關係鏈。
6、根據依賴關係,決定哪些目標要重新生成。
7、執行生成命令

Makefile中所有檔案的搜尋路徑,包括依賴檔案和目標檔案。 
變數“VPATH”的定義中,使用空格或者冒號(:)將多個目錄分開。make 搜尋的目錄順序
按照變數“VPATH”定義中順序進行(當前目錄永遠是第一搜索目錄)。

例如:

VPATH = src:../headers

它指定了兩個搜尋目錄,“src”和“../headers”。對於規則“foo:foo.c”如果“foo.c”在“src”
目錄下,此時此規則等價於“foo:src:/foo.c”

對於第二種來說:當需要為不型別的檔案指定
不同的搜尋目錄時需要這種方式

vpath:關鍵字

它所實現的功能和上一小節提到的“VPATH”變數很類似,但是
它更為靈活。它可以為不同型別的檔案(由檔名區分)指定不同的搜尋目錄。它的使用方法有三

1、vpath PATTERN DIRECTORIES 
為符合模式“PATTERN”的檔案指定搜尋目錄“DIRECTORIES”。多個目錄使用空格或者
冒號(:)分開。類似上一小節的“VPATH” 
2、vpath PATTERN 
清除之前為符合模式“PATTERN”的檔案設定的搜尋路徑

3、vpath

清除所有已被設定的檔案搜尋路徑。

對於vpath的詳細說明待續。

在執行make命令的時候,根據makefile執行步驟,首先讀入所有的makefile檔案,那麼

VPATH = include:src       //指定了makefile的搜尋路徑

或者

vpath %.h include    //指定.h型別檔案的搜尋路徑是include

vpath %.cpp src      //指定.cpp型別檔案的搜尋路徑是src

這僅僅是對於makefile來說搜尋目標和依賴檔案的路徑,但是對於命令列來說是無效的,也就是說

在執行g++或者gcc時不會自動從VPATH 或者vpath中自動搜尋要包含的標頭檔案等資訊檔案

此時要用到了 -I 或者--incude +路徑

例如依賴是:

main.o:main.cpp hello.h

即g++ -c $< -Iinclude,這時候,g++會自動從include目錄中搜索要包含的hello.h標頭檔案

相關推薦

linuxmakefile設定路徑的問題

開始接觸Makefile已經有好幾個月了,最近想好好學習學習 但是一個簡單的問題就卡殼了很簡單的一個問題 |-- Makefile |-- include |   `-- hello.h `-- src     |-- hello.cpp     `-- main.

linux如何設定dns快取記憶體伺服器

1.首先我們來複習一下什麼是dns DNS(Domain Name System,域名系統),全球資訊網上作為域名和IP地址相互對映的一個分散式資料庫,能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名解

linux如何設定電子郵箱dns解析

1.什麼是電子郵件呢? 電子郵件是—種用電子手段提供資訊交換的通訊方式,是網際網路應用最廣的服務。通過網路的電子郵件系統,使用者可以以非常低廉的價格(不管傳送到哪裡,都只需負擔網費)、非常快速的方式(幾秒鐘之內可以傳送到世界上任何指定的目的地),與世界上任何一個角落的網路使用者聯絡。 電子郵

關於LinuxMakefile 檔案的使用

                               關於Linux中Makefile 檔案的使用 大學有陣子做嵌入式的時候覺得

Linux的絕對路徑和相對路徑

絕對路徑 :路徑一定有根目錄“/ ”為始,例如/home/xss這個目錄。相對路徑:不以"/”為始, 如 home/xss 這個目錄,對於目錄的切換使用相對路徑更為快捷。例如 由/home/xss 到 /home/test 時,可以寫成“cd ../test "。這也就是相對

Linuxiptables設定詳細

無論如何,iptables是一個需要特別謹慎設定的東西,萬一伺服器不在你身邊,而你貿然設定導致無法SSH,那就等著被老闆罵吧,呵呵。。。以下內容是為了防止這種情況發生而寫的,當然很初級,不過一般伺服器也夠用了: 1.首先介紹一下指令和相關配置檔案 啟動指令:service

Linux如何設定服務自啟動?

有時候我們需要Linux系統在開機的時候自動載入某些指令碼或系統服務,主要用三種方式進行這一操作: ln -s             在/etc/rc.d/rc*.d目錄中建立/etc/init.d/服務的軟連結(*代表0~6七個執行級別之一) chkonfig    

Linux目錄以及路徑問題

以及 特殊 例如 http home 存在 直接 linu pwd 具體參考:https://www.cnblogs.com/OctoptusLian/p/8546580.html 在Linux中,存在著絕對路徑和相對路徑 絕對路徑:路徑的寫法一定是由根目錄 / 寫起的

linux設定PATH路徑

在linux中設定PATH的路徑總體來說有兩種方法,臨時型和長期型。 一.臨時型,用這種方法設定的PATH路徑,當系統登出後會消失。 #export PATH=$PATH:mypath 二、長期性

Linux關於別名、內部命令、hash緩存、以及外部命令(硬盤裏路徑)的優先級比較。

計算機 for 定義 hist -h linu 指定 history 我們 我們都知道:計算機中文件的讀取 內存>緩存>硬盤linux中別名是為了簡化某些命令的輸入,在終端輸入alias可以查詢系統存在的別名,用戶也可以自定義別名,具體為:alias 別名=‘命

Linux設定DNS

DNS簡介 DNS(Domain Name System,域名系統),全球資訊網上作為域名和IP地址相互對映的一個分散式資料庫,能夠使使用者更方便的訪 網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名 析)。DNS協議

Linux安裝的時候指定路徑

a、rpm包 如果指定Linux安裝軟體時所需要安裝到的目錄 為軟體包指定安裝目錄:要加 -relocate 引數;  rpm -ivh –relocate /=/usr/local/jkd    jdk_1.7_xxx.rpm b、原始碼包的安裝,例如

Linux 通過ssh訪問Github 設定

                         Linux   ssh訪問Github相關配置     如果在Linux t

LinuxC/C++編譯新增標頭檔案和庫路徑方式

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

如何在linux查詢python安裝包的路徑

[root]# python -c "import fasttext;print(fasttext)"<module 'fasttext' from '/root/anaconda3/lib/python3.6/site-packages/fasttext/__init__.py'> 其實你只要

Linux讓alias設定永久生效的方法詳解

前言 經常使用Linux控制檯終端的站長們應該對於那些繁瑣的指令和引數命令列印象深刻吧!這也是很多站長寧願使用有安全風險的面板也不願意使用控制檯終端命令列的主要原因!好在,明月早年間的DOS下學習程式設計的經歷,對於這種命令列式的風格還是偏愛有加,但對於那些幾乎經常要用到的命令列每次都要重複性的

如何在 Linux 為每個螢幕設定不同的桌布

多顯示器設定通常會在 Linux 上出現多個問題,但我不打算在本文中討論這些問題。我有另外一篇關於 Linux 上多顯示器支援的文章。 如果你使用多臺顯示器,也許你想為每臺顯示器設定不同的桌布。我不確定其他 Linux 發行版和桌面環境,但是 GNOME 桌面 的 Ubuntu 本身並不提供此功能。 不要

linuxsvn客戶端設定忽略

很簡單。 svn propedit svn:ignore 【目錄】 舉個栗子:  我在/root/svn/ 資料夾下面 我想忽略這個資料夾下面的js所有的js檔案。 操作方式:  cd /root/svn svn propedit svn:ignore .&nb

一圖讓你理解Linux的環境變數設定

本文首先介紹了環境變數的通俗理解,然後給出了幾種不同設定方式的詳細解釋,與其他部落格不同,本部落格通過一張圖總體描述不同設定方式的作用範圍,生效時間。最後通過一個具體的例子說明了環境變數的設定格式。 什麼是環境變數 所謂的環境變數有時候是一種“快捷方式”,有時候又是

關於Linuxnohup.out日誌過大問題/設定定時任務清空

關於Linux中nohup.out日誌過大問題 在此解決如下: 1,在nohup.out 所在目錄建立一個ClearNohup.sh 指令碼,通過定時任務讓其每週清理一次。防止nohup檔案過大問題。 #!/bin/bash # Author: Ljohn # La