2013-09-03 3 views
1

Makefiles меня смущают. Все, что я пытаюсь сделать, это отделить некоторые функции от отдельного файла, но я не могу его скомпилировать. Что мне не хватает? Благодаря!Makefile Трудности

Makefile:

all: clientfunctions client 

clientfunctions.o: clientfunctions.c 
    gcc -c clientfunctions.c -o clientfunctions.o 

client.o: client.c clientfunctions.o 
    gcc -c client.c -o client.o 

client: client.o 
    gcc client.o -o client 

файлы .c и .h файлы также очень просто:

clientfunctions.h

#ifndef _clientfunctions_h 
#define _clientfunctions_h 
#endif 

void printmenu(); 

clientfunctions.c

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

void printmenu() { 
    fprintf(stdout, "Please select one of the following options\n"); 
} 

клиент .c

#include "clientfunctions.h" 

int main (int argc, char * argv[]) 
{ 
    printmenu(); 
    return 0; 
} 

Это ошибка, что я получаю:

Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [clientfunctions] Error 1

ответ

2

Попробуйте следующее.

all: client 

clientfunctions.o: clientfunctions.c 
    gcc -c clientfunctions.c -o clientfunctions.o 

client.o: client.c 
    gcc -c client.c -o client.o 

client: client.o clientfunctions.o 
    gcc client.o clientfunctions.o -o client 

Вот более идиоматический способ написать этот файл Makefile.

all: client 

client: client.o clientfunctions.o 
    $(CC) -o [email protected] $^ 
+0

Вот и все. Как клиент, так и клиент во всем: раздел, казалось, вызывают проблемы. Спасибо. – Alex

+0

См. Edit для лучшего способа создания Makefile. Не забудьте принять ответ, который решил вашу проблему. – Ziffusion

1

Вы должны собрать как .c файлы и связать их обоих в свой исполняемый файл. Вам нужна зависимость от clientfunctions.o в вашей client цели и включить этот объект в ссылке, чтобы сделать это

client: client.o clientfunctions.o 
    gcc client.o clientfunctions.o -o client 
+0

Спасибо. Похоже, мне также нужно было удалить 'clientfunctions' из строки all:. – Alex

+1

Да, если вы не укажете цель, make по умолчанию будет первым, который он найдет, начиная с верхней части базового make-файла. Это «все» в вашем случае. В настоящее время он объявляет две зависимости; один из них - 'clientfunctions' не существует – simonc

0

Вы не говорите на самом деле, что не так, кроме «Я не могу его скомпилировать», что говорит нам практически ничего. Попробуйте предоставить сообщение об ошибке или что-то в следующий раз.

Однако это не имеет ничего общего с make. В следующий раз, когда вы подумаете, что у вас проблема с файлом, просто вырезайте и пропустите команды в командной строке. Если они работают, тогда ваша проблема связана с make. Если они не работают, ваша проблема связана с вашими командами компиляции, и вы должны посмотреть на документацию для своего компилятора, чтобы решить эту проблему. Make - это в основном инструмент для запуска команд оболочки, в правильном порядке и в нужное время.

В вашем случае вам нужно добавить опцию -c в вашу строку компиляции, если вы хотите сгенерировать объектный файл. Без этой опции компилятор попытается сгенерировать исполняемый файл.

1

Вы работаете way слишком сложно. Вы можете полагаться на неявные правила и значительно упростить свой make-файл, все содержимое которого (возможно, в зависимости от того, какой Make вы используете) должно быть таким же простым, как:

client: client.o clientfunctions.o