2015-04-30 6 views
0

У меня есть странная проблема в моем проекте Geany. Проект чрезвычайно прост и содержит 3 файла в одном каталоге: main.c, foo.h и foo.c.Проект Geany включает ошибку компилятора

Compiler ошибка:

In file included from main.c:1:0: 
foo.h:4:12: warning: ‘bar’ used but never defined 
static int bar(void); 
      ^
/tmp/cc0zCvOX.o: In function `main': 
main.c:(.text+0x12): undefined reference to `bar' 
Compilation failed. 
collect2: error: ld returned 1 exit status 

Что происходит не так?

main.c:

#include "foo.h" 

int main(int argv, char* argc[]) 
{ 
    bar(); 
    return 0; 
} 

foo.h:

#ifndef _FOO_H_ 
#define _FOO_H_ 

static int bar(void); 

#endif // _FOO_H_ 

foo.c:

#include "foo.h" 

#include <stdio.h> 

static int bar(void) 
{ 
    printf("Hello World\n"); 
    return 1; 
} 
+0

Проект не включает правильный вызов для gcc. Обновите команды Build-> Set Build и/или рассмотрите использование make-файла. Сначала вы должны скомпилировать foo.c и сделать его объектным файлом, а не компилировать main.c. Возможно, запрограммированная команда компиляции для foo.c хорошо работает для вас, но вы должны ее подтвердить. – frlan

ответ

1

Если функция объявлена ​​как static, эта функция находится в . Объем файла означает, что область действия функции ограничена только единицей перевода (в данном случае исходным файлом). Другие функции, которые присутствуют в одном модуле компиляции, могут вызывать функции, но никакие функции, находящиеся вне модуля компиляции, не могут видеть определение (наличие) или вызов функции.

Связанный: Из C11 стандартного документа, главы, связь идентификаторов

If the declaration of a file scope identifier for an object or a function contains the storage class specifier static , the identifier has internal linkage.(30)

и, сноски (30),

A function declaration can contain the storage-class specifier static only if it is at file scope;

Решение: Удалите static в определении функции и декларации.

FWIW, нет большого смысла в том, чтобы поместить прямое объявление функции static в файл заголовка. Во всяком случае, функция static не может быть вызвана из других исходных файлов.

+0

Я удалил 'static', и он все еще говорит о неопределенной ссылке на bar. Интересно, если я переместил definion bar на foo.h (из foo.c), он компилируется. Это означает, что foo.c не входит в состав проекта Geany, может быть? –

+0

@JakeM Также удалите 'static' из файла заголовка. И вы не определяете функции в файлах заголовков. Возможно, в этом случае вы правы, по какой-то причине 'foo.c' не компилируется и не связывается с' main.c'. Проверьте это, пожалуйста. –

+0

Я уже удалил 'static' из обоих файлов. Как добавить foo.c в проект Geany? Я googled это, и ответ stackoverflow сказал, что вам не нужно, поскольку он связан автоматически, но, возможно, это неверно? –