Makefile在链接阶段失败

时间:2016-12-23 13:39:43

标签: makefile linker

我正在使用以下makefile(简化版本):

CFLAGS  = -Wall -fpermissive -DENV_EMBEDDED -I../utils/ -../usblib/include
CPPFLAGS = $(CFLAGS)
CXXFLAGS = $(CFLAGS)

LDFLAGS  = -lmisc -lrt

PNAME=Simulator

OBJ = simulated.o \
    buffer.o \
    common.o 

all: $(OBJ)
    $(LDFLAGS) -o $(PNAME) $(OBJ)

编译工作正常,make会自动选择正确的编译器并设置正确的flags-variable。但链接阶段失败,我得到一条关于"未知命令lmisc"的错误消息。所以看来,我的第二个"所有" -statement有问题,make不会应用默认的链接命令。

知道在这里要做什么才能让它成功链接?

谢谢!

2 个答案:

答案 0 :(得分:2)

配方缺少编译器/链接器命令。它应该是这样的:

String response = new String();
for (String line; (line = br.readLine()) != null; response += line);

答案 1 :(得分:0)

与其尝试编写自己的链接器命令,不如使用Make的内置规则,该规则是(如make -f /dev/null --print-data-base | sed -n '/^%: %\.o/,/^$/p'所示):

%: %.o
#  recipe to execute (built-in):
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

如果您将库适当地放在LDLIBS中,则可以简单地使用它:

LDLIBS = -lmisc -lrt

# 'all' should be phony, and depend on a real target
# Otherwise, you'll link every build, even when not needed
all: $(PNAME)
.PHONY: all

$(PNAME): $(OBJ)

如果您的某些源文件是C ++(存在CXXFLAGS,则意味着您需要告诉Make使用C ++链接器而不是C链接器:

LINK.o = LINK.cc