2017-02-24 413 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