Вы не "вызываете исходные файлы"; исходные файлы определяют функции и переменные, и при компиляции те, которые определены в разных файлах, могут использовать друг друга, если у них есть объявление (обычно в файле заголовка) или указатель (через методы динамической c ссылки, такие как POSIX dlsym () ).
Рассмотрим этот минимальный пример. Во-первых, пример . c:
#include <stdlib.h>
#include <stdio.h>
/* We expect someone else to define these */
extern int one(void);
int main(void)
{
printf("one() returned %d.\n", one());
return EXIT_SUCCESS;
}
и помощник. c:
int one(void)
{
return 2; /* TODO: It's not one! */
}
Вы компилируете каждый исходный файл в объектный файл:
gcc -Wall -O2 -c example.c
gcc -Wall -O2 -c helper.c
, а затем вы связываете их с исполняемой программой:
gcc -Wall -O2 example.o helper.o -o program
, которую вы можете запустить, используя
./program
Обычно каждый C исходный файл, который предоставляет функции или переменные, которые можно использовать вне этого файла, объявляет их в файле заголовка. Вот лучший пример.
градусы.h
#ifndef DEGREES_H
#define DEGREES_H
double radians_to_degrees(double);
double degrees_to_radians(double);
#endif /* DEGREES_H */
#ifndef
, #define
и #endif
используются в качестве защиты, так что если вы #include
файл более одного раза, функции объявляются только один раз. (Компилятор пожалуется, если увидит несколько объявлений. Кроме того, нам не нужно использовать здесь extern
.)
Реализация вышеизложенного будет в градусах. c,
#ifndef PI
#define PI 3.14159265358979323846
#endif
double degrees_to_radians(double degrees)
{
return degrees * PI / 180.0;
}
double radians_to_degrees(double radians)
{
return radians * 180.0 / PI;
}
В программе myprog. c в том же проекте вы должны использовать приведенное выше, таким образом:
#include <stdlib.h>
#include <stdio.h>
#include "degrees.h"
int main(void)
{
printf("45 degrees is %.6f radians.\n", degrees_to_radians(45.0));
printf("2 radians is %.3f degrees.\n", radians_to_degrees(2.0));
return EXIT_SUCCESS;
}
и снова вы ' d сначала скомпилируйте два исходных файла в объектные файлы,
gcc -Wall -O2 -c degrees.c
gcc -Wall -O2 -c myprog.c
, а затем скомпилируйте их вместе с программой, например, myprog ,
gcc -Wall -O2 degrees.o myprog.o -o myprog
, которую затем можно запустить:
./myprog
Также возможно скомпилировать и связать функции и переменные, объявленные в градусов.h , с библиотекой stati c (libdegrees.a
) или динамической c (libdegrees.so
), и установите файл заголовка в стандартное расположение, чтобы ваша программа могла вместо этого использовать #include <degrees.h>
и ссылку программы на библиотеку через -ldegrees
, но это лучше оставить, пока вы не освоитесь с несколькими файлами.
До тех пор вы можете найти следующий Makefile полезный
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS :=
PROGS := myprog
all: clean $(PROGS)
clean:
rm -f *.o $(PROGS)
%.o: %.c
$(CC) $(CFLAGS) -c $^
myprog: degrees.o myprog.o
$(CC) $(CFLAGS) $^ -o $@
Вы можете добавить несколько программ в строку PROGS
, разделив их пробелами, и скопировать myprog:
строки для каждого, перечисляя объектные файлы, которые нужны программе.
При этом все, что вам нужно для компиляции программы, - это набрать make
.
Этот форум ест вкладки, а в Makefiles требуется отступ использовать тех. Итак, если вы просто скопируете это в файл, это не сработает. Однако вы можете исправить это, запустив
sed -e 's|^ *|\t|' -i Makefile
, который удаляет все начальные пробелы в каждой строке с вкладкой в файле Makefile.
Если вы используете отдельные библиотеки, обычно libm
( #include <math.h>
), вам просто нужно добавить -lm
(da sh ell em) в строку LDFLAGS
. Если вы в конечном итоге поиграете с динамическими c линковками, это -ldl
.
Если бы вы написали графическую программу с помощью Gtk +, вы бы добавили `pkg-config --cflags gtk+-3.0
` (включая обратные кавычки) к CFLAGS
строка и `pkg-config --libs gtk+-3.0
` для строки LDFLAGS
и #include <gtk/gtk.h>
для вашей программы.