Ответ 1
В GCC переключатель -c
- это то, что вы хотите.
-c
означает "скомпилировать, не ссылаться", и вы получите выходной файл name.o
.
Как я могу скомпилировать исходные файлы C без необходимости добавлять в них функцию main
?
Я получаю сообщение об ошибке для файлов .c
, которые не имеют основной функции и не хотят добавлять основную функцию только для компиляции.
В GCC переключатель -c
- это то, что вы хотите.
-c
означает "скомпилировать, не ссылаться", и вы получите выходной файл name.o
.
Используйте параметр -c
вашего компилятора (работает для GCC, опция, вероятно, идентична для других компиляторов c).
Из справочной страницы GCC:
Когда вы вызываете GCC, он обычно делает предварительная обработка, компиляция, сборка и связывание. "Общие параметры" позволяют остановить этот процесс на промежуточный этап. Например, -c указывает, что не запускать компоновщик. Тогда выход состоит из объекта файлы, выводимые ассемблером.
Эта фаза связывания - это шаг, который ищет main()
и жалуется, если он не находит его.
Предположим, что у вас есть hello.c:
#include<stdio.h>
#include<stdlib.h>
_start()
{
exit(my_main());
}
int my_main()
{
printf("Hello");
return 0;
}
Скомпилировать как:
gcc -nostartfiles hello.c
и вы можете получить из него исполняемый файл.
Вы можете скомпилировать отдельные файлы без main
, но вы не можете их связать и, конечно же, не сможете их запускать, так как они не являются полными программами. Обратите внимание: valgrind - это не инструмент статического анализа, а инструмент времени исполнения, поэтому он бесполезен для отдельных единиц перевода, не связанных с исполняемой программой.
Если вы хотите протестировать отдельные файлы, общая практика состоит в том, чтобы включить в каждый файл что-то вроде следующего:
#ifdef UNIT_TEST
int main(int argc, char **argv)
{
/* unit test code goes here */
}
#endif
И скомпилируйте файл с помощью -DUNIT_TEST
.