【发布时间】:2015-10-27 20:32:03
【问题描述】:
我有一个示例项目,我正在使用一本书“Learn C the hard way”。但我不能让它编译。
我认为我的 Makefile 有问题。我想做的是构建一个库,然后从中调用一些函数。但是在编译测试时我得到了
cthehardway/dlib/tests/list_tests.c:36: undefined reference to `List_pop'
这是我的 Makefile:
CFLAGS=-g -O2 -Wall -Wextra -Isrc -rdynamic -DNDEBUG $(OPTFLAGS)
LIBS=-ldl $(OPTLIBS)
PREFIX?=/usr/local
SOURCES=$(wildcard src/**/*.c src/*.c)
OBJECTS=$(patsubst %.c,%.o,$(SOURCES))
TEST_SRC=$(wildcard tests/*_tests.c)
TESTS=$(patsubst %.c,%,$(TEST_SRC))
TARGET=build/libd.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))
# The Target Build
all: $(TARGET) $(SO_TARGET) tests
dev: CFLAGS=-g -Wall -Isrc -Wall -Wextra $(OPTFLAGS)
dev: all
$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
ar rcs $@ $(OBJECTS)
ranlib $@
$(SO_TARGET): $(TARGET) $(OBJECTS)
$(CC) -shared -o $@ $(OBJECTS)
build:
@mkdir -p build
@mkdir -p bin
# The Unit Tests
.PHONY: tests
tests: CFLAGS += $(TARGET)
tests: $(TESTS)
sh ./tests/runtests.sh
# The Cleaner
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/
# The Checker
check:
@echo Files with potentially dangerous functions.
@egrep '[^_.>a-zA-Z0-9](str(n?cpy|n?cat|xfrm|n?dup|str|pbrk|tok|_)\
|stpn?cpy|a?sn?printf|byte_)' $(SOURCES) || true
这里是项目本身的链接(它很小,只有几个文件); 项目为dlib文件夹,外部文件无视。
只有测试目标失败。该库构建良好。
【问题讨论】:
-
在错误发生之前 make 的输出是什么?
-
在你知道如何没有 Make之前,你不能用Make做任何事情。您应该尝试“手动”构建测试代码(即从命令行,不使用 Make)。如果它有效,这是一个 Make 问题,如果它没有,那么它不是。无论哪种方式,您都可以想出一个更简单的示例。
-
@Beta 仍然没有“手动”构建,给出同样的错误