Компиляция с заголовочными файлами - PullRequest
3 голосов
/ 16 октября 2010

Почему я должен специально скомпилировать исходный файл C с:

gcc prog.c -lm

, даже если я уже включил специальный заголовочный файл с:

#include <math.h>

Ответы [ 4 ]

5 голосов
/ 16 октября 2010

Файл #include сообщает компилятору, как выглядит функция, в каком виде она возвращает, сколько параметров каких типов она принимает, но не сообщает компилятору о содержимом.

Флаг -lm включает ту математическую библиотеку, которая содержит код для вызываемых функций.

Он работает так же, как printf(), fread() и другие стандартные функции.Когда вы включаете stdio.h, на самом деле вы включаете не код функции, а определения.Поскольку библиотека C неявно связана, и вам ничего не нужно делать, вы этого не замечаете.

2 голосов
/ 16 октября 2010

Поскольку вам нужно сообщить компилятору, с какой математикой библиотека связана с ней, ничего общего с включением math.h.

1 голос
/ 16 октября 2010

Аналогично вашему собственному коду, который должен иметь заголовочные файлы (.h) для объявлений функций и исходные файлы (.c) для определений функций, код для математической библиотеки состоит из двух частей.Заголовочный файл, который вы включаете, содержит объявления функций:

double sqrt(double n);

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

0 голосов
/ 16 октября 2010

Потому что в C технически абсолютно нет связи между файлом заголовка и библиотекой.Заголовочных файлов может быть больше, чем библиотек, или наоборот.Это просто вопрос соглашения (и, конечно, это имеет некоторый смысл) в большинстве случаев иметь соотношение 1: 1.

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