2017-02-24 97 views
-1

我明白为什么会出现这个错误,但我不明白我做错了什么。这里是我的设置:Makefile undefined reference

  • extra.c:包含一些辅助函数定义
  • extra.h:包含原型&包括extra.c
  • foo.c的:我的主要程序,进口utils.h

我的Makefile文件如下:

CC=gcc 
foo_CFLAGS=-Wall 

all: foo 

clean: 
    rm -f foo *.o 

install: 
    install -m 0755 foo /bin 

PRIMARY_TARGETS = foo.o other_stuff.o more_stuff.o 
SECONDARY_TARGETS = extra.o 

foo: $(PRIMARY_TARGETS) $(SECONDARY_TARGETS) 
    $(CC) $(foo_CFLAGS) $^ -o [email protected] 

$(PRIMARY_TARGETS): %.o: %.c 
    $(CC) -c $(foo_CFLAGS) $^ -o [email protected] 

$(SECONDARY_TARGETS): %.o: %.c utils_folder/utils.c 
    $(CC) -c $(foo_CFLAGS) $< -o [email protected] 

仅供参考目标被分割进入主要和次要,因为一些utils.c功能需要在extra.c

这里引用年代的错误我得到:

undefined reference to `my_utils_function_1' 

难道我接近二级指标的一部分走错了路?链接器不需要知道该utils.c文件的问题,以便在extra.c中定义/实现缺少的函数?

编辑

这里的Makefile文件堆栈跟踪:

| foo.o: In function `foo_init': 
| /home/build/foo.c:33: undefined reference to `my_utils_function_1' 
| collect2: error: ld returned 1 exit status 
| Makefile:17: recipe for target 'foo' failed 
| make: *** [foo] Error 1 
+0

或者你没有代码'my_utils_function_1',只定义了它的原型。你能告诉我们一个函数定义的片段吗?你可以发布一个makefile完整执行的跟踪(实际上是链接步骤) –

+0

我做了,我目前正在查看它。问题是我不能发布实际的代码(你可以从我的描述中得知),因为这是一个工作项目。我更加想知道我的方法学是否存在固有的错误。当然是 – Niko

+0

!发布makefile执行痕迹,并只是你的函数的定义(在.c文件中)。不会泄露任何机密代码。 –

回答

1

您不引用utils.o在小学或中学,所以他们没有联系 -

+0

utils.o实际上不应该被构建。 utils.c的功能被用来做extra.o,但是除此之外不会被使用。 – Niko

+0

划痕,你说得对。我需要生成utils.o并稍后链接 – Niko

相关问题