Как я могу скомпилировать исходные файлы C без необходимости добавлять в них функцию main?
Я получаю сообщение об ошибке для файлов .c, которые не имеют основной функции и не хотят добавлять основную функцию только для компиляции.
Как я могу скомпилировать исходные файлы 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.