2013-02-12 107 views
4

test.c的kernel.asm在文件夾中SRC生成文件是文件夾調試中,只是像這樣:未定義參考`的printf」

src 
    test.c 
    kernel.asm 
Debug 
    Makefile 

所有這些文件都是非常簡單的代碼。但是,如果我的文件夾Debug在運行make,我會收到以下錯誤:

ld -Ttext 0x30400 -o test ../Debug/kernel.o ../Debug/test.o 
../Debug/test.o: In function `Print_String': 
test.c:(.text+0xf): undefined reference to `printf' 

有人能告訴我爲什麼嗎?內容如下:

test.c的

#include <stdio.h> 

int m = 1; 
void Print_String() 
{ 
    printf("TEST"); 
} 

kernel.asm

extern m 
extern Print_String 

[section .text] 
global _start 
_start: 
    mov eax, m 
    call Print_String 

的Makefile

# This Program 
TARGET = test 

# All Phony Targets 
.PHONY : everything clean all 

DIR  = .. 

OBJ  = $(DIR)/Debug/kernel.o $(DIR)/Debug/test.o 
C_FILE = $(DIR)/src/test.c 
K_ASM = $(DIR)/src/kernel.asm 

ASM  = nasm 
LD  = ld 
CC  = gcc 

CC_FLAG = -c -g 
ASM_FLAG = -f elf 
LD_FLAG = -Ttext 0x30400 

# Default starting position 
everything : $(TARGET) 

clean : 
    rm -f $(TARGET) 

all : clean everything 

kernel.o : $(K_ASM) 
    $(ASM) $(ASM_FLAG) -o [email protected] $< 

test  : $(OBJ) 
    $(LD) $(LD_FLAG) -o [email protected] $(OBJ) 

test.o : $(C_FILE) 
    $(CC) $(CC_FLAG) -o [email protected] $< 
+3

將'-lc'添加到ld命令行可能會有所幫助。 – 2013-02-12 14:42:08

+10

除非你有自己的printf版本,否則你必須鏈接到C運行庫('-lc')。 – 2013-02-12 14:42:40

+2

除「-lc」,「-I/lib/ld-linux.so.2」外,您可能還需要另一個ld標誌。 ld,默認情況下,查找「... so.1」,這會給出一個令人困惑的「文件未找到」錯誤! – 2013-02-12 23:30:06

回答

3

除非您有自己的printf版本,否則您必須鏈接到C運行時庫。

將選項-lc傳遞給ld命令。