2016-01-12 5 views
0

У меня есть простая программа на C, которую я должен сделать (которая не может использовать основную функцию).Компиляция программы C без Main

Как таковой:

test.c

#include <stdio.h> 

int getUserID(int id); 

int getUserID(int id) { 
    return 0; 
} 

Где моя текущая функция ничего не делает, как сейчас: Однако я пытаюсь скомпилировать это через Makefile, как таковой:

all: 
    gcc test.c 

Это не сработало, потому что у меня не было основного, поэтому я добавил в него команду -c.

all: 
    gcc -c test.c 

который теперь компилирует с замыкающих, но дает мне объектный файл (но без рабочего исполняемого файла), исполняемый файл, я получаю, когда я пытаюсь запустить его: i.e ./test tells me permission denied

Любая помощь будет принята с благодарностью.

+2

@CollinD Он уже пробовал это. –

+2

@BaummitAugen Это не меняет того факта, что этот вопрос уже задан. Там также есть хорошее объяснение, почему он не может делать то, что он просит, и некоторые другие предложения, которые он на самом деле не пытался. – CollinD

+2

Почему у него нет основной функции? – immibis

ответ

5

У вас не может быть программы на C++ или C без main (без зла, нестандартные хаки как минимум). Вы можете создать библиотеку без main, но не автономный исполняемый файл.

Для автономных приложений функция main имеет решающее значение, поскольку она определяет, с чего начать выполнение.

1

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

Если вам не разрешено иметь основную функцию в этом файле, должен быть другой файл, с которым вы должны связываться.

2

может создать изображение, где «главное» не является точкой входа.

Вот один из таких способов (с помощью GCC на системе RHEL6):

$ cat sample.c 
#include <stdio.h> 
#include <unistd.h> 

int notmain (void) { 
     printf("hello, world\n"); 
     exit(0); 
} 
$ cc -ffreestanding -c sample.c 
$ ld -enotmain -o sample sample.o -I/lib64/ld-linux-x86-64.so.2 -lc 
$ ./sample 
hello, world 

И, кстати, это не «зло, нестандартное хак» - С Стандарт определяет two execution environments : (1) «хостинг», с которым большинство людей знакомо, и (2) «автономный», который обычно является своего рода встроенной системой (тостер или еще много чего).

Смежные вопросы