我正在处理的项目的Makefile出现问题。我正在获得“对'timer_create'的未定义引用”,即使它们包含在linkopts中也是如此。我认为问题在于这些库位于编译行的开头而不是结尾,但是我对这样的Makefile非常不熟悉。如何确保链接位于结尾而不是开头?这是我正在谈论的Makefile的一部分,make会尝试这样做:
gcc -g -lpthread -lrt -Wall -o scheduler scheduler.o worker.o list.o smp5_tests.o testrunner.o
但是我很确定应该是这样:
gcc -g -Wall -o scheduler scheduler.o worker.o list.o smp5_tests.o testrunner.o -lpthread -lrt
这是Makefile:
CC = gcc
CCOPTS = -c -g -Wall
LINKOPTS = -g -lpthread -lrt -Wall
EXEC=scheduler
OBJECTS=scheduler.o worker.o list.o smp5_tests.o testrunner.o
all: $(EXEC)
$(EXEC):$(OBJECTS)
$(CC) $(LINKOPTS) -o $@ $^
答案 0 :(得分:0)
我认为问题在于这些库位于编译行的开头而不是结尾,但是我对这样的Makefile非常不熟悉。
好吧,这特定于GNU ld链接器,而不是为了本身:ld通过从左到右的单次传递来解决依赖关系,除了-Wl,--start-group
和-Wl,--end-group
(专门用于{{ 3}})。这意味着这些库必须放在使用它们的模块(或其他库)之后。
如何确保链接位于结尾而不是开头?
考虑如何使用默认规则(简化版):
%: %.o
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
这里LDFLAGS是“正常”链接器标志,可以安全地位于对象列表之前; LDLIBS是程序使用的系统库的列表。