2012-05-01 4 views
0

У меня есть небольшая проблема, и я попробовал все, чтобы проверить эту функцию, не могли бы вы мне помочь? Мне нужно написать файл C, который называется «взаимный_info.c», и ему нужна математическая функция. Я включил библиотеку и связал его в сборочном файле, но она по-прежнему дает мне «неопределенную ссылку для входа» ... мои включает выглядеть следующим образом: (я использую Eclipse, на Ubuntu)math.h связь с файлом

#include <stdio.h> 
#include <stdlib.h> 
#include "sample.h" 
#include "graph_or.h" 
#include <math.h> 

и мои Makefile выглядит следующим образом:

all: 

    gcc -g amostra.c sample.h -o amostra.o 

    gcc -g graph_or.c graph_or.h -o graph_or.o 

    gcc -g graph_w.c graph_W.h -o graph_W.o 

    gcc -g mutual_info.c -o mutual_info.o -lm 

clean: 
    rm *.o 

Я совершенно не знаю, что происходит, я даже пытался определить LDFLAGS перед командой «все» и положить его так:

LDFLAGS= -lm 
all: 

    gcc -g amostra.c sample.h -o amostra.o 

    gcc -g graph_or.c graph_or.h -o graph_or.o 

    gcc -g graph_w.c graph_W.h -o graph_W.o 

    gcc -g mutual_info.c -o mutual_info.o -lm 

clean: 
    rm *.o 

Но он все еще не будет работать !! Пожалуйста, всем, мне нужна помощь! Благодаря!

+0

Этот make-файл не имеет никакого смысла. Если вы хотите сгенерировать файлы .o, вам нужен флаг '-c', и вам не нужно указывать какие-либо параметры компоновщика (т. Е. Вам не нужно' -lm'). Затем вам понадобится отдельный вызов GCC, чтобы связать все файлы .o вместе. Кроме того, вам не нужно указывать файлы .h. –

+0

Простите, что @OliCharlesworth не мог понять, что вы говорите, не могли бы вы быть более конкретными или, может быть, показать мне код для make-файла? Я думал, что вам нужно связывать математическую библиотеку каждый раз, когда вы хотели ее использовать! Спасибо –

+0

Типичный шаблон для компиляции - это что-то вроде: 'gcc -c -o foo.o foo.c, gcc -c -o bar.o bar.o, gcc -o myApp foo.o bar.o -lm'. –

ответ

1

Давайте сделаем это шаг за шагом.

Обычный способ написать Makefile должен иметь правило для каждой цели, и использовать предпосылки:

thing: amostra.o graph_or.o graph_w.o mutual_info.o 
    gcc -g amostra.o graph_or.o graph_w.o mutual_info.o -o thing -lm 

mutual_info.o: mutual_info.c 
    gcc -g -c mutual_info.c -o mutual_info.o -lm 

amostra.o: amostra.c sample.h 
    gcc -g -c amostra.c -o amostra.o 

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c graph_or.c -o graph_or.o 

graph_w.o: graph_w.c graph_w.h 
    gcc -g -c graph_w.c -o graph_w.o 

mutual_info.o: mutual_info.c 
    gcc -g -c mutual_info.c -o mutual_info.o -lm 

(я понял, что вы хотите, исполняемый файл будет называться thing, и что вы имели в виду graph_w, а не graph_W.)

Это должно сработать, но мы можем сделать его более аккуратным. Сначала мы вводим automatic variables:

thing: amostra.o graph_or.o graph_w.o mutual_info.o 
    gcc -g $^ -o [email protected] -lm 

mutual_info.o: mutual_info.c 
    gcc -g -c $< -o [email protected] 

amostra.o: amostra.c sample.h 
    gcc -g -c $< -o [email protected] 

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c $< -o [email protected] 

graph_w.o: graph_w.c graph_w.h 
    gcc -g -c $< -o [email protected] 

mutual_info.o: mutual_info.c 
    gcc -g -c $< -o [email protected] 

Тогда мы видим, что эти рецепты используют ту же команду, поэтому мы создаем шаблонное правило:

thing: amostra.o graph_or.o graph_w.o mutual_info.o 
    gcc -g $^ -o [email protected] -lm 

amostra.o: sample.h 

graph_or.o: graph_or.h 

graph_w.o: graph_w.h 

%.o: %.c 
    gcc -g -c $< -o [email protected] 

Дайте этому попытку и сообщите нам, если это работает.

+0

Большое спасибо за ваше объяснение! Я попробовал, но это все равно дает мне ту же ошибку, я действительно не могу понять, что делаю неправильно :(есть ли что-нибудь еще, что я могу попробовать? –

+0

@ PL-RL, да, вы можете уменьшить свой код. вы можете удалить как можно больше и протестировать на каждом этапе, чтобы убедиться, что вы по-прежнему получаете ту же ошибку. Если вы можете сделать это, перейдите к одному исходному файлу из нескольких строк. Если вы не можете сделать его более простым (и все равно получите ошибку), отредактируйте свой вопрос и покажите нам код. – Beta

0

Это фрагмент из вашего файла Makefile? Вы пытались экспортировать LDFLAG? Я видел эту ошибку раньше, но всегда был зафиксирован с флагом -lm.

НКУ -lm -o бла blah.c

+0

Что вы говорите, это изменить -lm рядом с gcc? Я пробовал это, и он тоже не работал ... –

+0

-c компилирует источник, но не связывает его. Поэтому вам необходимо: gcc -c -o amostra.o amostra.c gcc -c -o graph_or.o graph_or.c gcc -c -o graph_w.o graph_w.c gcc -o YourExecutableName amostra.o graph_or .o graph_w.o -lm – Sirch

0

вам нужно:
НКУ -c -o amostra.o amostra.c
НКУ -c -o graph_or.o graph_or.c
НКУ -c -o graph_w.o graph_w.c
НКУ -c -o mutual_info.o mutual_info.c
НКУ -o YourExecutableName amostra.o graph_or.o graph_w.o mutual_info.o -lm

+0

Спасибо, но как насчет файла взаимной информации (тот, который мне нужно связать с математической библиотекой?) –

+0

Да, и тот один :) – Sirch

+0

Не работает: /, но спасибо в любом случае! –

0

Вот общий makefile, используя мое лучшее предположение о том, чего вы хотите достичь: он компилирует все *.c файлов в текущем каталоге и создает двоичный файл mutual_info.

RM := rm -f 
CC := gcc 
CFLAGS := -g 
LDLIBS := -lm 

SOURCES := $(wildcard *.c) 
OBJECTS := $(SOURCES:%.c=%.o) 
DEPS := $(SOURCES:%.c=%.d) 
BINARY := mutual_info 
FILES_TO_CLEAN := $(OBJECTS) $(DEPS) 

.PHONY : all clean realclean 

all : $(BINARY) 

clean : 
    $(RM) $(FILES_TO_CLEAN) 

realclean : FILES_TO_CLEAN += $(BINARY) 
realclean : clean 

-include $(DEPS) 

$(OBJECTS) : %.o : %.c 
    $(CC) $(CFLAGS) -c -MMD -o [email protected] $< 

$(BINARY) : $(OBJECTS) 
    $(CC) -o [email protected] $^ $(LDLIBS) 

Просьба уточнить, не то, что вы хотите.