Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C makefile中的硬链接_C_Makefile - Fatal编程技术网

C makefile中的硬链接

C makefile中的硬链接,c,makefile,C,Makefile,我很难弄清楚如何创建指向目标计划的两个硬链接。我的目标程序是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,我想创建两个到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
TARGET := foo
LINK := bar

$(LINK): Makefile | $(TARGET)
    ln -sf $| $@

问题是,如果使用符号链接,我现在必须手动创建指向foo的硬链接,方法是输入ln-s foo bar和ln-s foo baz:

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。请注意,很久以前,ln不支持-f,在那些日子里,-s也不是一个选项-我说的是很久以前的事了,像这些链接规则这样的规则会在运行ln命令之前使用rm-f删除链接

还可以使用通用宏$@和$@编写链接行?以下是POSIX支持的可靠宏:

${AUX2}: ${TARGET}
    ${LN_S} $? $@

这是合理的,因为${AUX2}只有一个先决条件;如果有多个先决条件,$?不起作用-小心。

如果使用符号链接:

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。请注意,很久以前,ln不支持-f,在那些日子里,-s也不是一个选项-我说的是很久以前的事了,像这些链接规则这样的规则会在运行ln命令之前使用rm-f删除链接

还可以使用通用宏$@和$@编写链接行?以下是POSIX支持的可靠宏:

${AUX2}: ${TARGET}
    ${LN_S} $? $@

这是合理的,因为${AUX2}只有一个先决条件;如果有多个先决条件,$?不起作用-小心。

您的帖子和评论中没有任何内容可以解释为什么需要硬链接。因此,我将继续我的前任的路线,试图向您展示如何通过软链接实现这一点

在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
TARGET := foo
LINK := bar

$(LINK): Makefile | $(TARGET)
    ln -sf $| $@
依赖关系必须是有序的,因为您不依赖于对目标的更改,您只关心它的存在,所以您没有挂起的链接,这是一件坏事


-f选项是支持GNU Make-B选项所必需的

您的帖子和评论中没有任何内容可以解释为什么需要硬链接。因此,我将继续我的前任的路线,试图向您展示如何通过软链接实现这一点

在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
TARGET := foo
LINK := bar

$(LINK): Makefile | $(TARGET)
    ln -sf $| $@
依赖关系必须是有序的,因为您不依赖于对目标的更改,您只关心它的存在,所以您没有挂起的链接,这是一件坏事



-f选项是支持GNU Make-B选项所必需的

小点:ln-s是一个符号链接,而不是硬链接。不过,您可能不需要硬链接。您是否尝试在${CC}之后添加ln-s$目标条。。。行?@GregBowser哦,好吧,我没意识到-s是一个符号链接。但我确实想要一个硬链接,因为我想让bar和baz代表与foo相同的程序,但只是有不同的名称。一个符号链接可以做到这一点。e、 g在我的系统上:/bin/sh是指向/bin/bash的符号链接,这基本上就是您要做的。99%的情况下,符号链接都是可行的。不管怎样,只是加上ln-s。。。$TARGET目标中的行应该可以做到这一点。实际上,在$TARGET的处理块中有两行ln-s,一行用于bar,一行用于baztarget@Apollo:对,这就是符号链接…小点:ln-s是符号链接,不是硬链接。不过,您可能不需要硬链接。您是否尝试在${CC}之后添加ln-s$目标条。。。行?@GregBowser哦,好吧,我没意识到-s是一个符号链接。但我确实想要一个硬链接,因为我想让bar和baz代表与foo相同的程序,但只是有不同的名称。一个符号链接可以做到这一点。e、 g在我的系统上:/bin/sh是指向/bin/bash的符号链接,这基本上就是您要做的。99%的情况下,符号链接都是可行的。不管怎样,只是加上ln-s。。。$TARGET目标中的行应该可以做到这一点。实际上,在$TARGET的处理块中有两行ln-s,一行用于bar,一行用于baztarget@Apollo:对,这就是符号链接……这是不正确的。符号链接的规则中有两个细微的错误:首先,对目标的依赖关系应该是顺序,第二个ln-f标志必须用于正确支持Make-B选项。${AUX1|2}目标在尝试创建符号链接之前应该实际执行'rm$@',还建议链接行是:${ln|S}-f$^$@@user3629249为什么要删除它们?如果你有一个很好的理由,告诉我,这样我可以学习。一般来说,在makefiles中,最好避免使用rm,然后再次使用它们,因为这样会更改目录,并且可能存在依赖于该目录的目标。最好尝试将文件替换到位,而不立即删除它。@MarkGaleck:请澄清。你说的“订单”是什么意思
只有'?据我所知,它不是POSIX make的一部分。至于另一个,那么您可以使用-f,它将更好地与GNU make支持的非标准选项-B配合使用。您还可以使用rm-f编写规则,以便在创建链接之前删除该链接。这在很多很多年前ln获得-f选项之前是必要的。如果你说makeBarBaz,它将创建链接。如果只说make,它只创建makefile中的第一个目标。请注意,我的版本有一个规则all:它依赖于foo、bar和baz作为第一个规则,因此当您键入make时,它会创建所有依赖项。使用GNU make,您可以添加。PHONEY:all clean告诉make它们是虚假的目标,而不是真实的文件。这是不正确的。符号链接的规则中有两个细微的错误:首先,对目标的依赖关系应该是顺序,第二个ln-f标志必须用于正确支持Make-B选项。${AUX1|2}目标在尝试创建符号链接之前应该实际执行'rm$@',还建议链接行是:${ln|S}-f$^$@@user3629249为什么要删除它们?如果你有一个很好的理由,告诉我,这样我可以学习。一般来说,在makefiles中,最好避免使用rm,然后再次使用它们,因为这样会更改目录,并且可能存在依赖于该目录的目标。最好尝试将文件替换到位,而不立即删除它。@MarkGaleck:请澄清。你所说的“仅限订单”是什么意思?据我所知,它不是POSIX make的一部分。至于另一个,那么您可以使用-f,它将更好地与GNU make支持的非标准选项-B配合使用。您还可以使用rm-f编写规则,以便在创建链接之前删除该链接。这在很多很多年前ln获得-f选项之前是必要的。如果你说makeBarBaz,它将创建链接。如果只说make,它只创建makefile中的第一个目标。请注意,我的版本有一个规则all:它依赖于foo、bar和baz作为第一个规则,因此当您键入make时,它会创建所有依赖项。使用GNU make,您可以添加.PHONEY:all clean来告诉make它们是虚假的目标,而不是真实的文件。