2014-11-08 62 views
0

我很難搞清楚如何創建兩個硬鏈接到我的目標程序。我的目標程序是foo,我想創建兩個硬鏈接到foo,一個名爲baz,另一個名爲bar。目前我的makefile如下:生成文件中的硬鏈接

CC = gcc 
CFLAGS = -g -std=c99 -pedantic -Wall 
HOME = /my/home/dir 
SOURCES = main.c bar.c baz.c datastructure.c ${HOME}/addNodes.c 
OBJECTS = $(SOURCES:.c=.o) 
TARGET = foo 
LN_F = ln -f 

$(TARGET): $(OBJECTS) 
    ${CC} ${CFLAGS} -o [email protected] $^ 

%.o : %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

bar: ${TARGET} 
    ${LN_F} ${TARGET} bar 

baz: ${TARGET} 
    ${LN_F} ${TARGET} baz 

的問題是,我現在必須創建硬鏈接手動富,通過輸入"ln -s foo bar""ln -s foo baz"

+2

小點:ln -s是一個符號鏈接,不是硬鏈接。儘管你可能不想要硬鏈接。您是否嘗試在'$ {CC}'...行之後添加'ln -s $(TARGET)bar'? – 2014-11-08 04:15:22

+0

@GregBowser哦,好的,我沒有意識到-s是一個符號鏈接。但我絕對想要一個硬鏈接,因爲我想要bar和baz代表與foo相同的程序,但只是有不同的名稱。 – Apollo 2014-11-08 04:24:08

+1

符號鏈接將做到這一點。例如在我的系統上:'/ bin/sh'是'/ bin/bash'的符號鏈接,這基本上就是你想要做的。符號鏈接是99%的時間。無論如何,只需在'$(TARGET)'目標中添加'ln -s ...'行就可以了。 – 2014-11-08 04:32:13

回答

3

如果你去符號鏈接:

TARGET = foo 
AUX1 = bar 
AUX2 = baz 
LN_S = ln -s -f 

all: ${TARGET} ${AUX1} ${AUX2} 

${TARGET}: $(OBJECTS)               
    ${CC} ${CFLAGS} -o [email protected] $^              

${AUX1}: ${TARGET} 
    ${LN_S} ${TARGET} ${AUX1} 

${AUX2}: ${TARGET} 
    ${LN_S} ${TARGET} ${AUX2} 

如果使用硬鏈接,則將使用ln -f(不含-s)。請注意,很久以前,-f不支持ln(並且在那些日子裏,-s也不是一個選項 - 我正在談論很久以前),並且像這些鏈接規則這樣的規則在運行ln命令之前,將使用rm -f刪除鏈接。

您也可以使用通用的宏[email protected]$?(這些都是可靠的,POSIX支持宏)寫的鏈接線:

${AUX2}: ${TARGET} 
    ${LN_S} $? [email protected] 

這工作三立因爲沒有爲${AUX2}只有一個前提條件;如果有多個先決條件,$?將不起作用 - 請小心。

+0

這是不正確的。在符號鏈接規則中有兩個細微的錯誤:首先,對目標的依賴性應該僅僅是順序,第二個'ln -f'標誌必須被用來正確支持Make'-B'選項。 – 2014-11-08 08:25:00

+0

在嘗試創建符號鏈接之前,$ {AUX1 | 2}目標實際上應執行'rm $ @',並且還建議鏈接爲:$ {LN_S} -f $^$ @ – user3629249 2014-11-08 09:23:00

+0

@ user3629249他們爲什麼要這樣做?去掉?如果你有一個很好的理由,告訴我,這樣我就可以學習。一般來說,在makefile中,最好避免使用「rm」,然後重新創建它們,因爲這會改變目錄,並且可能會有依賴目錄的目標。應該總是嘗試更換文件,而不是暫時刪除文件。 – 2014-11-08 09:30:27

0

您的帖子和評論中沒有任何內容解釋了爲什麼需要硬鏈接。所以我會繼續我的前任的行列,試圖告訴你如何用軟鏈接來做到這一點。

創建符號鏈接makefile中的目標正確的方法是這樣的:

TARGET := foo 
LINK := bar 

$(LINK): Makefile | $(TARGET) 
    ln -sf $| [email protected] 

依存一定要整理,只是因爲你不依賴於變化的目標,你只關心它存在,所以你沒有掛鏈接,這是一件壞事。

-f選項是必要的,以支持GNU Make -B選項。