未定义对“ timer_create”的引用,即使包含“ -lrt”也已编译

时间:2019-04-04 16:59:12

标签: makefile compiler-errors

我正在处理的项目的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 $@ $^

1 个答案:

答案 0 :(得分:0)

  

我认为问题在于这些库位于编译行的开头而不是结尾,但是我对这样的Makefile非常不熟悉。

好吧,这特定于GNU ld链接器,而不是为了本身:ld通过从左到右的单次传递来解决依赖关系,除了-Wl,--start-group-Wl,--end-group(专门用于{{ 3}})。这意味着这些库必须放在使用它们的模块(或其他库)之后。

  

如何确保链接位于结尾而不是开头?

考虑如何使用默认规则(简化版):

%: %.o
    $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

这里LDFLAGS是“正常”链接器标志,可以安全地位于对象列表之前; LDLIBS是程序使用的系统库的列表。