嘗試編譯參考兩個庫的main時出現未定義的參考錯誤。我在不同的檔案夾中有兩個檔案lib1/func1.c和lib2/func2.c。這些檔案包含兩個函式,函式正在呼叫。我將它們分別編譯成兩個庫和. 但是,當我嘗試編譯正在呼叫的main時,出現以下錯誤:print1()print2()print1()print2()libfunc1.alibfunc2.aprint1()
/usr/bin/ld: /home/sv/ztest2/lib1/libfunc1.a(func1.o): in function print1:
/home/sv/ztest2/lib1/func1.c:7: undefined reference to print2
collect2: error: ld returned 1 exit status
make: *** [Makefile:21: DP] Error 1
這是代碼和Makefile:
生成檔案:
TARGET = DP
HOME = /home/slav/FORECAST/ztest2
INCDIRS = -I./ \
-I$(HOME)/lib1 \
-I$(HOME)/lib2
LIBDIRS = -L$(HOME)/lib1 \
-L$(HOME)/lib2
SRCFILES = DP.c
OBJFILES = DP.o
CFLAGS = -g -O3 $(INCDIRS)
all: $(TARGET)
$(TARGET): $(OBJFILES)
cc $(CFLAGS) -o $(TARGET) $(OBJFILES) $(LIBDIRS) -lfunc2 -lfunc1
clean:
-rm *.o $(TARGET)
DP.c:
#include "func1.h"
int main()
{
print1();
return 0;
}
函式1.h:
void print1();
函式1.c:
#include <stdio.h>
void print1()
{
printf("print1 is called!\n");
print2();
}
函式2.h:
extern void print2();
函式2.c:
#include <stdio.h>
void print2()
{
printf("print2 is called!\n");
}
uj5u.com熱心網友回復:
庫必須按照需要其符號的順序列出。
該命令cc $(CFLAGS) -o $(TARGET) $(OBJFILES) $(LIBDIRS) -lfunc2 -lfunc1告訴聯結器首先使用該func2庫來決議它正在構建的可執行檔案中的任何未決參考,然后使用該func1庫。
由于聯結器func2首先處理,并且在它這樣做的時候,沒有對 的掛起參考print2,所以聯結器不會將模塊包含print2在可執行檔案中。
稍后,當聯結器正在處理時func1,它會將模塊包含print1在可執行檔案中,因為main使用它。該模塊print1使用print2,因此包含該模塊會添加對print2. 然后,當聯結器完成處理時func1,它有一個未決議的參考。聯結器不會回傳以func2再次檢查它。
由于func1庫依賴于func2,請將鏈接命令更改為cc $(CFLAGS) -o $(TARGET) $(OBJFILES) $(LIBDIRS) -lfunc1 -lfunc2.
(如果func2庫也依賴于func1,這是一個糟糕的設計,應該重新考慮。如果沒有更改,要求聯結器多次重新考慮庫,如-lfunc1 -lfunc2 -lfunc1,可能會解決直接問題,但可能會出現其他問題。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485111.html
下一篇:c中檔案閱讀器的無限回圈
