Проблема с созданием проекта в C - PullRequest
0 голосов
/ 06 декабря 2009

Я делаю проект на C, и у меня проблема с его сборкой. Это:

У меня есть две отдельные подсистемы [A и B] в моем проекте, которые используют функциональность еще одной подсистемы [C]. Для этого они #include необходимые файлы заголовков. Обязательство состоит в том, что обе подсистемы [A и B] должны быть построены отдельно, и я имею в виду, что у меня есть два отдельных файла Makefile для подсистем, и я запускаю команду make для каждой из них отдельно.

Теперь, когда я пытаюсь объединить все мои подсистемы [A, B, C] в один проект, gcc сообщает, что некоторые функции уже объявлены и эти функции принадлежат подсистеме C.

Я понимаю, что заголовочные файлы включаются во время компиляции, т.е. когда я использую 'make' в подсистемах [A и B]. Поэтому, когда я пытаюсь объединить их всех, их фактически объявляют дважды.

Может кто-нибудь помочь мне с решением этой проблемы? Любое решение, которое не требует от меня компиляции обеих подсистем [A и B], будет хорошим.

Ответы [ 3 ]

3 голосов
/ 06 декабря 2009

Ну, это либо ошибка компиляции, либо ошибка компоновщика.

Если это ошибка во время компиляции , вам нужно использовать некоторые защитные элементы в ваших .h файлах, например:

#ifndef FILE_NAME_H
#define FILE_NAME_H

// file contents here

#endif

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

Если это ошибка времени соединения , это обычно происходит, когда в заголовочных файлах есть тела функций (то есть {}). Поскольку несколько файлов будут содержать заголовок, каждый из них будет иметь свое собственное определение в объектном коде, что приведет к конфликту компоновщика.

Лучший способ обойти это - просто убедиться, что все функциональные тела помещаются в файлы .c. Вы можете попробовать и __inline__ их, если они достаточно короткие, но компилятор не обязательно будет вас слушать.

0 голосов
/ 06 декабря 2009

Содержит ли ваш C-заголовочный файл только объявление или также реализацию?

Если он содержит реализацию, вы должны извлечь его и скомпилировать отдельно.

0 голосов
/ 06 декабря 2009

Вы можете использовать #ifndef .., чтобы избежать двойного включения заголовочного файла

#ifndef <some name identifying the header file>
#define <some name identifying the header file>
//
//

// header file content will go here 

//

// 
#endif
...