2010-11-25 50 views
1

這裏是我的Makefile:如何解決Makefile中的鏈接問題?

DIR=.. 
ARG=$(QUERY_STRING) 

MAIN=main 

SRC_DIR=$(DIR)/src 
BIN_DIR=$(DIR)/bin 
INC_DIR=$(DIR)/inc 
LIB_DIR=$(DIR)/lib 

LIBS=markdown 

all: $(MAIN) exec 


$(MAIN): $(MAIN).o 
    $(LD) $^ -L $(LIB_DIR) -l $(LIBS) -o $(BIN_DIR)/[email protected] 

$(MAIN).o: $(SRC_DIR)/$(MAIN).c 
    $(CC) $^ -I $(INC_DIR) -o [email protected] 

exec: 
    $(BIN_DIR)/$(MAIN) $(ARG) 

clean: 
    rm -f *.o core.* $(BIN)/$(MAIN) 

它明確界定我的項目是如何組織的,所以我不會解釋。它編譯沒有任何問題,但在二進制施行$(BIN_DIR)/$(MAIN)出現以下錯誤:

../bin/main: error while loading shared libraries: rintf: cannot open shared object file: No such file or directory 
make: *** [exec] Error 127 

rintf屬於什麼庫?我試圖鏈接-lc,但這並不能解決問題。我的Makefile有什麼問題嗎?或者我應該鏈接一些額外的$(MAIN)

在此先感謝您的回覆。

回答

3

你應該從來沒有直接調用ld連接程序;總是使用你的編譯器來做鏈接。它將各種額外的參數傳遞給ld以使事情發揮作用。將$(LD)替換爲$(CC)。不管它是否真正解決了你的問題,都要這樣做。

'很奇怪,你沒有得到錯誤信息中指定的共享對象的名稱。

該手冊頁爲rintf()表示它在<math.h>中聲明;最有可能的是,您需要將數學庫添加到鏈接行:-lm

我會改寫一些您的Makefile:

LIB1 = -lmarkdown 
LIB2 = -lm 
LIBS = $(LIB1) $(LIB2) 
LDFLAGS = -L $(LIB_DIR) 

... 

$(MAIN): $(MAIN).o 
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/[email protected] 
+2

+1。另外,`all:$(MAIN)exec`規則是不明智的; Make不承諾按照從左到右的順序構建目標的先決條件。更好:`all:exec`和`exec:$(MAIN)`。 – Beta 2010-11-25 16:58:57

1

通常,當鏈接器無法找到所需的共享對象(.so文件)時,會出現此錯誤。我假定Linux平臺。

在Linux操作系統中,您可以使用以下搜索文件:findlocate。如果可以找到.so文件,請嘗試使用ldconfig來更新鏈接程序高速緩存。如果它不起作用,請檢查/etc/ld.conf.d/下的鏈接器配置文件以查看是否包含庫路徑。如果您更改了配置,請不要忘記再次更新緩存!