2014-11-08 65 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选项。