2014-02-26 61 views
0

我在C中使用makefile存在輕微問題。我一直在教科書中遵循教程,但它似乎並不想工作。我有三個文件,message_hider.c,encrypt.h和encrypt.c。當我爲這些文件創建一個makefile時,它會返回一個錯誤,但是當我單獨運行每個命令時,它工作得很好。這是我的文件。C makefile undefined - 引用錯誤

encrypt.c

#include "encrypt.h" 

void encrypt(char *message) { 
char c; 
while (*message) { 
*message = *message^31; 
message++; 
} 
} 

message_hider.c

#include <stdio.h> 
#include "encrypt.h" 

int main() { 
char msg[80]; 
while (fgets(msg, 80, stdin)) { 
encrypt(msg); 
printf("%s", msg); 
} 
} 

encrypt.h

void encrypt(char *message); 

生成文件

message_hider: message_hider.o encrypt.o 
    gcc message_hider.o encrypt.o -o message_hider 
message_hider.o: message_hider.c encrypt.h 
    gcc -c message_hider.c 
encrypt.o: encrypt.c encrypt.h 
    gcc -c encrypt.c 

錯誤消息

$ make message_hider 
cc message_hider.o -o message_hider 
message_hider.o:message_hider.c:(.text+0x17): undefined reference to `encrypt' 
message_hider.o:message_hider.c:(.text+0x17): relocation truncated to fit: R_X86_64_PC32  against undefined symbol `encrypt' 
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld:  message_hider.o: bad reloc address 0x0 in section `.pdata' 
/usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld: final link failed: Invalid operation 
collect2: error: ld returned 1 exit status 
<builtin>: recipe for target 'message_hider' failed 
make: *** [message_hider] Error 1 
+2

它似乎沒有使用你的makefile。嘗試用'echo building $ @'替換'message_hider'規則中的命令('gcc message_hider.o ...'),並告訴我們會發生什麼。 – Beta

+0

我替換它,它出現了完全相同的錯誤 – jeebz88

+0

'make --version'的輸出是什麼,你確定你在製作文件中使用製表符而不是四個空格嗎? – merlin2011

回答

0
$ make message_hider 
cc message_hider.o -o message_hider 

也就是說您已在Makefile中指定的規則。首先,它似乎使用cc而不是gcc。第二,有沒有在那裏提到encrypt.o這就是爲什麼你的鏈接失敗。

嘗試顯式使用生成文件,如用:

make -f Makefile message_hider 

這可能是因爲它撿了不同的makefile文件,一個要麼有不同的規則,或者是一個簡單的依賴於像.c.o默認規則。


,並根據您的更新是:

make -f Makefile message_hider 

爲您提供:

$ make -f Makefile message_hider 
make: Makefile: No such file or directory 
make: *** No rule to make target 'Makefile'. Stop. 

Makefile實際上並不存在這就是你的錯誤。

因此,您需要檢查它是否在當前目錄中,並且完全按照您的預期命名。

這將解釋前面提到的默認規則的用法,因爲您的makefile實際上並未被拾取。

另一件要檢查的事情,雖然現在我們已經看到了上面的錯誤,但現在可能是沒有意義的,因爲你實際上正在運行正確的make程序。使用which make找出它的位置(在CygWin上應該是/usr/bin/make),並使用make --version來檢查版本。

+0

當我嘗試將它寫了上面的命令輸出:$使-f生成文件message_hider 化妝:Makefile文件:沒有這樣的文件或目錄 化妝:***沒有規則使目標'Makefile'。停止。 – jeebz88

+0

這使得輸出的/ usr/bin中/讓像你說和版本輸出GNU讓4.0,內置了x86_64的-PC-cygwin的 – jeebz88

+0

@ jeebz88,這就是你得到時,有_no_生成文件的錯誤。所以要麼不在那裏,要麼命名不正確。 – paxdiablo