linux make파일 작성할때

somedayhow의 이미지

구성요소는

main이 있고

메인이

Initialize();

Create_Net( Network );

Layout( Network );

SupervisedTrain( Network);

Free_Memory (Network);

위 함수들을 호출하고

SupervisedTrain이

Run과 ShowResult를 호출하고

Run이 Activation을 호출하는 구조입니다.

각종 선언들은 basicn.h안에 넣었습니다.

struct NeuralNetwork * Initialize();

void Create_Net(struct NeuralNetwork *);

void ShowOption (struct NeuralNetwork *);

void Layout(struct NeuralNetwork *);

void SupervisedTrain(struct NeuralNetwork * Network);

void Run(struct NeuralNetwork * Network);

double Activation(double Value);

void ShowResult (struct NeuralNetwork *, int l);

void Free_Memory(struct NeuralNetwork *);

각각의 함수들은

함수이름.c로 저장이 되었습니다.

그래서 다음과 같이 Make파일을 작성했습니다.

CC	= gcc
 
LDFLAGS	= -lm
 
all : basicN1Ad
 
basicN1Ad : Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory. main.o basicn.h
	gcc -c -o basicN1Ad main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm
 
Initialize.o : Initialize.c basicn.h
	gcc -c -o Initialize.o Initialize.c
 
Create_Net.o : Create_Net.c basicn.h
	gcc -c -o Create_Net.o Create_Net.c
 
Layout.o : Layout.c basicn.h
	gcc -c -o Layout.o Layout.c
 
SupervisedTrain.o : SupervisedTrain.c Run.o ShowResult.o basicn.h
	gcc -c -o SupervisedTrain.o SupervisedTrain.c Run.c Activation.c ShowResult.c -lm
 
Run.o : Run.c Activation.o basicn.h
	gcc -c -o Run.o Run.c Activation.c -lm
 
Activation.o : Activation.c basicn.h
	gcc -c -o Activation.o Actvation.c -lm
 
ShowResult.o : ShowResult.c basicn.h
	gcc -c	-o ShowResult.o ShowResult.c 
 
Free_Memory.o : Free_Memory.c basicn.h
	gcc -c -o Free_Memory.o Free_Memory.c
 
main.o : main.c basicn.h
	gcc -c -o main.o main.c

하지만 여기서
administrator@ubuntu:~/week1$ make
gcc -c -o Run.o Run.c Activation.c -lm
gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
compilation terminated.
make: *** [Run.o] 오류 4

이런 에러가 납니다.

어디서 잘못된 것일까요?

cinsk의 이미지

gcc option 중 -c 와 -o 는 같이 쓸 수 없습니다. 둘 중 하나만 쓰세요.

somedayhow의 이미지

책에는 함께 젹혀있는데 책이 잘못되었나 보군요ㅎㅎ

답변 고맙습니다^^

이전에 나타났던 에러는 없어졌습니다.

그런데

administrator@ubuntu:~/week1$ make
gcc -o Run.o Run.c Activation.c -lm
/tmp/ccIwcELL.o:(.bss+0x0): multiple definition of `Training_Count'
/tmp/cc4600BM.o:(.bss+0x0): first defined here
/tmp/ccIwcELL.o:(.bss+0x8): multiple definition of `TrainingTime'
/tmp/cc4600BM.o:(.bss+0x8): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [Run.o] 오류 1

라는 오류가 발생합니다

Run과 Activation은 메인에 접근 하는 일이 없는데 이게 무슨 일인지..

SupervisedTrain이 Run을 호출하고 Run이 Activation을 호출하고 Run으로 돌아가고 Run이 다시 SupervisedTrain으로 가는 구조입니다.

undefined reference to 'main' ... 어떻게 해결가능할까요?

----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를

cinsk의 이미지

.c를 .o로 만들때에는 -c 옵션을 쓰고, .o에서 실행 파일을 만들 때에만 -o를 쓰세요.

somedayhow의 이미지

SupervisedTrain 이 호출하는

Run이 다시 호출하는

Activation.o를 가장 먼저 만들고

Activation.o : Activation.c basicn.h
gcc -v -c Actvation.c -lm

그 뒤에

Activation.o에 의존하는

Run을 만들고

Run.o : Run.c Activation.o basicn.h
gcc -v -c Run.c Activation.c -lm

그리고 SupervisedTrain을 만들엇습니다

SupervisedTrain.o : SupervisedTrain.c Run.o ShowResult.o basicn.h
gcc -v -c SupervisedTrain.c Run.c Activation.c ShowResult.c -lm

CC	= gcc
 
LDFLAGS	= -lm
 
all : basicN1Ad
 
basicN1Ad : Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o main.o basicn.h
	gcc -v -o basicN1Ad main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm
 
Initialize.o : Initialize.c basicn.h
	gcc -v -c Initialize.c
 
Create_Net.o : Create_Net.c basicn.h
	gcc -v -c Create_Net.c
 
Layout.o : Layout.c basicn.h
	gcc -v -c Layout.c
 
SupervisedTrain.o : SupervisedTrain.c Run.o ShowResult.o basicn.h
	gcc -v -c SupervisedTrain.c Run.c Activation.c ShowResult.c -lm
 
Run.o : Run.c Activation.o basicn.h
	gcc -v -c Run.c Activation.c -lm
 
Activation.o : Activation.c basicn.h
	gcc -v -c Actvation.c -lm
 
ShowResult.o : ShowResult.c basicn.h
	gcc -v -c ShowResult.c 
 
Free_Memory.o : Free_Memory.c basicn.h
	gcc -v -c Free_Memory.c
 
main.o : main.c basicn.h
	gcc -c main.c
 
clean :
	rm -rf *.o diary

하지만 다음과 같은 메시지가 나옵니다

TrainingCount 와 TrainingTime은 헤더에 있는 전역변수입니다.

gcc -v -o basicN1Ad main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'basicN1Ad' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o basicN1Ad /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
Initialize.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Initialize.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Create_Net.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Create_Net.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Layout.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Layout.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
SupervisedTrain.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
SupervisedTrain.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Free_Memory.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Free_Memory.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
SupervisedTrain.o: In function `SupervisedTrain':
SupervisedTrain.c:(.text+0x8c): undefined reference to `Run'
SupervisedTrain.c:(.text+0x61c): undefined reference to `ShowResult'
SupervisedTrain.c:(.text+0x640): undefined reference to `ShowResult'
collect2: ld returned 1 exit status
make: *** [basicN1Ad] 오류 1

어느 책이나 자료를 찾아봐도

myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o : main.c a.h
gcc -c main.c
2.o : 2.c a.h b.h
gcc -c 2.c
3.0 : 3.c b.h c.h
gcc -c 3.c

와 같이 간단한 예가 나와있거나

매크로로 떡칠해서 무슨말인지 모르겠는 코드만 나와있어서 어떻게 해야할지 모르겠습니다 ㅠㅠ

제 경우처럼

main이 호출하는 함수가 또 다른 함수들을 호출하는 경우는

make파일을 어떻게 해야할지 모르겠습니다.

도움을 부탁드립니다

그리고 SupervisedTrain도 ShowResult를 호출하고

main도 ShowResult를 호출하고

Run도 ShowResult를 호출하는 경우에는

어떻게 메이크 파일을 만들어야 동작할까요?

----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를

ymir의 이미지

이거 다 링커 에러입니다.
에러 메시지로 구글링 해보시면 어떻게 해결해야 하는지 금세 찾을 수 있을 겁니다.

각각 static 또는 전역 변수가 중복되었거나, 해당 함수 또는 변수가 정의되어 있지 않은 경우입니다.
아래 gloomyr 님의 글은 여러 소스에서 헤더를 include 하는 경우, 중복 선언을 방지하는 방법으로.. 헤더 작성할 때의 기초가 되는 내용입니다.

일단 링커 뜬거 보면 컴파일은 다 된거 같고, Makefile 은 별 문제 없어 보이기는 한데..
정 의심스러우시면 Makefile 을 아래처럼 간단히 정리하고 나서 다시 해보세요.

object file 들은 implicit rule 에 의해 처리됩니다.

TARGET=foobar
 
CC=gcc
 
SRCS=foo.c bar.c main.c
OBJS=$(SRCS:.c=.o)
 
CFLAGS=-g -W -Wall
LDFLAGS=-L.
LIBS=-lm
 
all: $(TARGET)
 
$(TARGET): $(OBJS)
        $(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
 
clean:
        @/bin/rm -f *.o $(TARGET)

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

oosap의 이미지

/tmp/ccIwcELL.o:(.bss+0x0): multiple definition of `Training_Count'
/tmp/cc4600BM.o:(.bss+0x0): first defined here

Training_Count 라는 함수가 두 개 이상의 모듈에 들어가 있는데 그 두 개 이상의 모듈을 링크하려 하는 경우 같아요.
저의 경우 헤더파일에 함수를 선언해 놓고 그 헤더파일을 두개 이상의 .c 파일에서 #include 하도록 하면 각 .c 파일에서 만들어진 .o 파일들이 링크되려 할 때이런 오류가 나더군요.

/tmp/ccIwcELL.o:(.bss+0x8): multiple definition of `TrainingTime'
/tmp/cc4600BM.o:(.bss+0x8): first defined here

위와 같은 문제 같고요..

/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'

이건 링킹으로 최종 바이너리로 생성하려는데 main 함수가 들어간 모듈이 없었다고 에러를 낸 건대, 흔히 이런 건 라이브러리나 오브젝트 파일이 링커의 명령줄에 위치할 때의 순서가 잘못된 원인인 경우가 흔합니다. 혹은 정말 main 함수가 포함된 모듈이 최종 링킹에서 빠졌을 수도 있고요.

가장중요한 건 컴파일 에러를 살펴볼 때는 -v 옵션을 사용하라는 것입니다. gcc 는 cc1, collect2, ld, as 등등을 사용해서 여러단계의 컴파일 작업을 수행하는데 각 단계의 어떤 부분에서 에러가 났는지를 알아야 하거든요. gcc 에서 -v 를 주면 각 단계별 실행문과 출력 메세지가 다 나오기 때문에 문제 파악에 -v 는 필수입니다.

제가 헛다리 짚었을 수 있습니다. 소스코드가 없으니 어쩔 수 없지만요..

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

somedayhow의 이미지

TrainingTime 과 Training_Count는 헤더파일에 있는 전역변수 입니다

코드 중간에 별표뿌려놓은 곳에 있습니다.

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
 
#define e 2.7183 //used in sigmod function
#define randomize() srand(unsigned)time(NULL) //initializing rand function
#define random(n) (rand() % (n)) // limited region rand function
struct Dendrites  // connects each neuron and pass the signal
{	
	double Weight; //connction intensity
	//double back_Weight // It will be hard to make equation of complex network, so using back_connection weight would be better
	//struct Dendrite * Added_Dendrites // Using this we would be able to add_Neuron, It need more malloc
};
 
struct Neurons
{
	struct Dendrites *  Dendrite;
	int DendriteCount; //number fo dendrites
	double Bias;  
	double Value;  // The value to be passed to next layer of neurons
	double Delta; // the delta of neuron (used while leanrning)
	//struct Neuron * Added_Neuron // same purpose as Added_Neuron, we need one more step to access this variable (spend more time),
	//therefore, maybe there is better idea to add_Neuron or something like that. We can use realloc(var,size)
	//but need study more about realloc.
};
 
struct Layers //Layer containing number of neurons
{
	struct Neurons * Neuron; //neurons in the layer
	int NeuronCount;  // Number of neurons
	//struct Layer * Added_Layer // same purpose as Added_Dendrites
};
 
struct NeuralNetwork
{
	struct Layers * Layer;
	int LayerCount; 
	double LearningRate;
	//struct NeuralNetwork * Connected_NeuralNetwork //Connected would be better when we think the meaning
};
 
int Training_Count = 0;         .***********************TrainingCount,time*************************
double *OutTch;                    ************************************************
struct timeval Ttime;            ******************************************************
long TrainingTime=0;             **********************************************
//NeuralNetwork Network;
 
 
struct NeuralNetwork *  Initialize();
void CreateNet(struct NeuralNetwork *);
//void ShowOption (struct NeuralNetwork *);
void Layout(struct NeuralNetwork *);
void SupervisedTrain(struct NeuralNetwork * Network);
void Run(struct NeuralNetwork * Network);
double Activation(double Value);
void ShowResult (struct NeuralNetwork *, int l);
void Free_Memory(struct NeuralNetwork *);
//void Option(struct NeuralNetwork * Network);

헤더에 전역변수가 있으니

각 함수가 헤더파일에 의존한다는 것으로 생각해서

모든 .c파일을 컴파일할때 헤더파일을 넣어줬습니다.

이부분이 잘못된 걸까요?

CC	= gcc
 
LDFLAGS	= -lm
 
all : basicN1Ad
 
basicN1Ad : Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o main.o basicn.h
	gcc -v -o basicN1Ad main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm
 
Initialize.o : Initialize.c basicn.h
	gcc -v -c Initialize.c
 
Create_Net.o : Create_Net.c basicn.h
	gcc -v -c Create_Net.c
 
Layout.o : Layout.c basicn.h
	gcc -v -c Layout.c
 
SupervisedTrain.o : SupervisedTrain.c Run.o ShowResult.o basicn.h
	gcc -v -c SupervisedTrain.c Run.c Activation.c ShowResult.c -lm
 
Run.o : Run.c Activation.o basicn.h
	gcc -v -c Run.c Activation.c -lm
 
Activation.o : Activation.c basicn.h
	gcc -v -c Actvation.c -lm
 
ShowResult.o : ShowResult.c basicn.h
	gcc -v -c ShowResult.c 
 
Free_Memory.o : Free_Memory.c basicn.h
	gcc -v -c Free_Memory.c
 
main.o : main.c basicn.h
	gcc -c main.c
 
clean :
	rm -rf *.o diary

말씀하신대로 -v를 넣어서 makefile을 만들었을때

다음과 같은 메시지가 나옵니다

gcc -v -o basicN1Ad main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.6/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'basicN1Ad' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o basicN1Ad /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. main.o Initialize.o Create_Net.o Layout.o SupervisedTrain.o Free_Memory.o -lm -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o
Initialize.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Initialize.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Create_Net.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Create_Net.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Layout.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Layout.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
SupervisedTrain.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
SupervisedTrain.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
Free_Memory.o:(.bss+0x0): multiple definition of `Training_Count'
main.o:(.bss+0x0): first defined here
Free_Memory.o:(.bss+0x8): multiple definition of `TrainingTime'
main.o:(.bss+0x8): first defined here
SupervisedTrain.o: In function `SupervisedTrain':
SupervisedTrain.c:(.text+0x8c): undefined reference to `Run'
SupervisedTrain.c:(.text+0x61c): undefined reference to `ShowResult'
SupervisedTrain.c:(.text+0x640): undefined reference to `ShowResult'
collect2: ld returned 1 exit status
make: *** [basicN1Ad] 오류 1

어느 책이나 자료를 찾아봐도

myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o : main.c a.h
gcc -c main.c
2.o : 2.c a.h b.h
gcc -c 2.c
3.0 : 3.c b.h c.h
gcc -c 3.c

와 같이 간단한 예가 나와있거나

매크로로 떡칠해서 무슨말인지 모르겠는 코드만 나와있어서 어떻게 해야할지 모르겠습니다 ㅠㅠ

제 경우처럼

main이 호출하는 함수가 또 다른 함수들을 호출하는 경우는

make파일을 어떻게 해야할지 모르겠습니다.

도움을 부탁드립니다

----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를

oosap의 이미지

별표하신 부분의 변수 정의가 문제가 됩니다.
변수든, 함수든 선언과 정의를 구분하는데요,
헤더파일에 정의를 하는 것은
- 인라인 함수
정도만 하는 것이 좋습니다.

(헤더파일은 어떤 구현체라기 보다는 구현체의 명세서로 간주되거든요. 그래서 소스코드의 보안을 유지하는 경우에도 헤더파일은 공개를 합니다. 구현체가 없기 때문이겠지요??? 주관적인 견해입니다만..)

그 외의 함수나 변수를 헤더파일에 정의를 하면 이와 같은 문제가 생기게 되고 그 이유는 물론 헤더파일이 여러 모듈에 #include 되게 되기 때문입니다.

그 외의 함수나 변수는 헤더파일이 아닌 .c혹은 .cpp 파일에 합니다. 헤더파일에는 정의가 아닌 선언만 합니다.

int Training_Count = 0;         .***********************TrainingCount,time*************************
double *OutTch;                    ************************************************
struct timeval Ttime;            ******************************************************
long TrainingTime=0;             **********************************************

는 하나의 .c 파일로 옮기고
해당 변수를 사용하는 다른 .c 파일에서 혹은 그 .c 파일이 #include 하는 헤더파일에 다음과 같이 extern 선언을 하면 되겠군요.
extern int Training_Count;
extern double *OutTch;
extern struct timeval Ttime;
extern long TrainingTime;

extern 선언에서는 값의 초기화를 할 수 없습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

gloomyr의 이미지

#ifndef __AA__
#define __AA__
#endif
~

somedayhow의 이미지

무슨말씀이신지?

----------------------------------------------------------------------------------------------------------------------
많이 배워갑니다
고맙습니다.
언젠가 질문이 아니라 답변을 달아줄 수 있는 날이 오기를

gloomyr의 이미지

전역변수들 extern 으로 받아 쓰세요.

헤더파일에 #ifndef ~ #define #endif 로 중복안되게 ..

ALL 타겟이 있으니 밑에 타겟들은 필요없을듯

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.