Как скомпилировать исходный код C без основной функции? - PullRequest
29 голосов
/ 23 апреля 2011

Как я могу скомпилировать мои исходные файлы C без необходимости помещать в них функцию main?

Я получаю сообщение об ошибке для файлов .c, которые не имеют основной функции и не хотятнеобходимо добавить основную функцию только для компиляции.

Ответы [ 4 ]

36 голосов
/ 23 апреля 2011

В GCC переключатель -c - это то, что вам нужно.

-c означает «компилировать, но не связывать», и вы получите name.o выходной файл.

9 голосов
/ 11 декабря 2012

Предположим, у вас есть hello.c:

#include<stdio.h>
#include<stdlib.h>
_start()
{
   exit(my_main());
}
int my_main()
{
   printf("Hello");
   return 0;
}

Скомпилируйте как:

gcc  -nostartfiles  hello.c 

и вы сможете получить из него исполняемый файл.

9 голосов
/ 23 апреля 2011

Используйте опцию -c вашего компилятора (работает для GCC, опция, вероятно, идентична для других компиляторов c).

со справочной страницы GCC:

Когда вы вызываете GCC, обычно предварительная обработка, компиляция, сборка и ссылки. «Общие параметры» позволит вам остановить этот процесс на промежуточный этап. Например, Опция -c говорит не запускать компоновщик. Тогда вывод состоит из объекта вывод файлов ассемблером.

Фаза связывания - это шаг, который ищет main() и жалуется, если не находит его.

3 голосов
/ 23 апреля 2011

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

Если вы хотите протестировать отдельные файлы, обычной практикой является включение в каждый файл что-то вроде следующего:

#ifdef UNIT_TEST
int main(int argc, char **argv)
{
    /* unit test code goes here */
}
#endif

И скомпилируйте файл с помощью -DUNIT_TEST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...