【问题标题】:variable in makefile, unexpected behaviourmakefile 中的变量,意外行为
【发布时间】:2016-06-26 04:18:41
【问题描述】:

我有 makefile,我注意到一些特殊的地方。

在标有<------ 的行上,如果我输入$(OBJECTS) 而不是String.o,则编译失败。但是我定义了OBJECTS=$(String.o),为什么会这样呢?

LIBS=-ldl $(OPTLIBS)
PREFIX?=string-automaton/
DESTDIR=/home/jenia/learn-c-the-hard-way/lib2/
CFLAGS=-g -O2 -Wall -Wextra -rdynamic -DNDEBUG -Llibstrl


OBJECTS=$(String.o)

TARGET=build/lib_String.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))

# The Target Build
all: build $(TARGET) $(SO_TARGET) 

$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS) 
    ar rcs $@ $(OBJECTS)   
    ranlib $@

$(SO_TARGET): $(TARGET) $(OBJECTS)   
    $(CC) -shared -o $@  String.o     # <----------- $(OBJECTS) woud fail

build:
    @mkdir -p build
    @mkdir -p bin

clean:
    rm -rf build $(OBJECTS) $(TESTS)
    rm -f tests/tests.log
    find . -name "*.gc*" -exec rm {} \;
    rm -rf `find . -name "*.dSYM" -print`

# The Install
install: all
    install -d $(DESTDIR)/$(PREFIX)/lib/
    install $(TARGET) $(DESTDIR)/$(PREFIX)/lib/

另外,作为后续问题,如果我将$(OBJECTS) 添加到&lt;----- 行并从它之前的行中删除$(OBJECTS),那么它会编译。像这样:

$(SO_TARGET): $(TARGET) 
$(CC) -shared -o $@ $(OBJECTS)    

那么有人可以回答我为什么$(OBJECTS) 不能解析为String.o 在线&lt;----- 吗?

谢谢

【问题讨论】:

  • $(...) 是生成文件中的变量扩展。所以$(String.o) 告诉make 扩展名为String.o 的变量并使用它的值。由于您可能没有任何此类变量,因此您在 OBJECTS 中得到一个空值。

标签: c makefile gnu working-set


【解决方案1】:

这是因为$(String.o) 将解析为另一个字符串——如果String.o 未定义,则可能是一个空字符串。

我猜你应该替换

OBJECTS=$(String.o)

OBJECTS=String.o

【讨论】:

  • 对不起,我在您回答后立即更改了最后一句话。只是为了确定,你的答案在改变后仍然持有吗?在你回答最后一行之前是:那么有人可以回答我为什么$(OBJECTS)&lt;----- 上无法解析为$(String.o)
  • 是的,答案是一样的。
  • 非常感谢。它现在可以完美编译。我需要再等 4 分钟才能接受。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多