我很难弄清楚如何创建两个指向我的目标程序的硬链接。我的目标程序是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 $@ $^
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
bar: ${TARGET}
${LN_F} ${TARGET} bar
baz: ${TARGET}
${LN_F} ${TARGET} baz
问题是我现在必须通过输入"ln -s foo bar"
和"ln -s foo baz"
答案 0 :(得分:3)
如果你使用符号链接:
TARGET = foo
AUX1 = bar
AUX2 = baz
LN_S = ln -s -f
all: ${TARGET} ${AUX1} ${AUX2}
${TARGET}: $(OBJECTS)
${CC} ${CFLAGS} -o $@ $^
${AUX1}: ${TARGET}
${LN_S} ${TARGET} ${AUX1}
${AUX2}: ${TARGET}
${LN_S} ${TARGET} ${AUX2}
如果您使用硬链接,则会使用ln -f
(不包含-s
)。请注意,一段时间(很久很久以前)-f
不支持ln
(在那些日子里,-s
也不支持 - 我正在谈论很久以前),像这些链接规则这样的规则会在运行rm -f
命令之前使用ln
删除链接。
您还可以使用通用宏$@
和$?
编写链接行(这些是可靠的POSIX支持的宏):
${AUX2}: ${TARGET}
${LN_S} $? $@
这很有效,因为${AUX2}
只有一个先决条件;如果有多个先决条件,$?
将不起作用 - 请小心。
答案 1 :(得分:0)
您的帖子和评论中没有任何内容可以解释为什么需要硬链接。所以我将继续我的前任的路线,试图向您展示如何使用软链接。
在makefile中创建目标符号链接的正确方法如下:
TARGET := foo
LINK := bar
$(LINK): Makefile | $(TARGET)
ln -sf $| $@
依赖项必须是仅订单的,因为您不依赖于目标的更改,您只关心它是否存在,因此您没有挂起链接,这是一件坏事。
-f
选项是支持GNU Make -B
选项所必需的。