2016-10-10 22 views
1

我在編譯multiple definition of大量變量時出現錯誤。例如:`多重變量`很多變量錯誤 - 我的make文件不正確?

/tmp/ccwHwJ7t.o:(.data+0x0): multiple definition of `serial_number' 
/tmp/ccmT1XNI.o:(.data+0x0): first defined here 

所有的變量都位於ftdi.h,這是由main.c包括在內。我的make文件有什麼問題導致它包含兩次?或者我正在看錯方向。

SSHELL = /bin/sh 
CC = gcc 

APP = npi_usb_ftdi 
INC = include 

INCDIRS +=-I${INC} 

CFLAGS= ${INCDIRS} -Wall -Wextra 
LIBS = libftd2xx.a -ldl -lpthread -lrt 


all: ${APP} 

${APP}: src/main.c src/ftdi.c src/vt100.c src/monitor.c 
    ${CC} ${CFLAGS} src/main.c src/ftdi.c src/vt100.c src/monitor.c -o ${APP} ${LIBS} 

ftdi.o: 
    ${CC} -c -o src/ftdi.o src/ftdi.c 

vt100.o: 
    ${CC} -c -o src/vt100.o src/vt100.c 

monitor.o: 
    ${CC} -c -o src/monitor.o src/monitor.c 


clean: 
    rm -f src/*.o ; rm -f src/*~ ; rm -f *~ ; rm -f ${APP} 
+4

首先,永遠不要在頭文件中放置變量/函數定義。其次,在編寫頭文件時總是使用頭文件('#ifndef FOO_H' ...)。 – Lundin

+0

'ftdi.h'是否也包含在'ftdi.c'或任何其他文件中? – mch

+0

似乎已在您指向的庫中定義了'serial_number'。只是爲了檢查重命名後的變量 – Akaks

回答

1

您可能在其他源文件中也包含.h文件。沒問題,但只有在一個源文件中應該聲明變量並在其他變量中定義。我使用:

// ftdi.h 
#ifndef EXTERN 
# define EXTERN extern 
#endif 
EXTERN int examplevar; 

// main.c 
#define EXTERN 
#include "ftdi.h" 

// ftdi.c 
#include "ftdi.h"