Да, этот вопрос задавался много раз, и я смотрел и читал форумы и сообщения SO, но ответы все не связаны (или, как они кажутся) с этим. Итак, у меня есть главный файл:C предупреждение: неявное объявление функции
- sgbd_server.c -
#include "sgbd_server.h"
/**
* Open server pipe and return handle. -1 = error
*/
int open_server_pipe() {
return pipe_open(FIFO_NAME, O_RDONLY, S_CON_COLOR);
}
/**
* Close server pipe
*/
void close_server_pipe(int fd) {
pipe_close(fd, FIFO_NAME, S_CON_COLOR);
}
int main(int argc, char *argv[]) {
int pipe_fd;
pipe_fd = open_server_pipe();
if (pipe_fd == -1) {
perror("Cannot open pipe");
}
close_server_pipe(pipe_fd);
exit(EXIT_SUCCESS);
}
Затем файлы заголовков:
- sgbd_server.h -
#include "common.h"
#define FIFO_NAME "./sgbd_server_pipe"
#define BUFFER_SIZE PIPE_BUF
#define S_CON_COLOR 1 /* C_COLOR_RED */
- common.h -
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "console.h"
#define CLIENT_FIFO_PREFIX = "./sgbd_client_"
int pipe_open(char *f, int mode, int color);
void pipe_close(int pipe_fd, char *f, int color);
Две функции pipe_open
и pipe_close
определены в pipe.c
и в основном возвращаются 0
и void
. Этот последний файл компилируется отдельно в файле Make.
Я не гуру в делать Make-файлы, но ради этого вопроса, здесь:
SERVER = sgbd_server
CLIENT = sgbd_client
CC = gcc
C_FLAGS = -Wall -I.
LINKER = gcc
L_FLAGS = -Wall -l pthread -Wall -I.
RM = rm -f
client: sgbd_client.o pipe.o console.o
@echo -n "Building client... "
@$(LINKER) $(L_FLAGS) -o $(CLIENT) sgbd_client.o pipe.o console.o
@echo "Complete!\n"
server: sgbd_server.o pipe.o console.o
@echo -n "Building server... "
@$(LINKER) $(L_FLAGS) -o $(SERVER) sgbd_server.o pipe.o console.o
@echo "Complete!\n"
sgbd_client.o: sgbd_client.c
@echo -n "Refreshing client sources... "
@$(CC) $(C_FLAGS) -c sgbd_client.c
@echo "Done!"
sgbd_server.o: sgbd_server.c common.h
@echo -n "Refreshing server sources..."
@$(CC) $(C_FLAGS) -c sgbd_server.c common.h
@echo "Done!"
pipe.o: pipe.c
@echo -n "Refreshing pipe sources..."
@$(CC) $(C_FLAGS) -c pipe.c
@echo "Done!"
console.o: console.c
@echo -n "Refreshing console sources..."
@$(CC) $(C_FLAGS) -c console.c
@echo "Done!"
clean:
@echo -n "Cleaning up executables and object files... "
@$(RM) $(SERVER) $(CLIENT) *.o
@echo "Ok\n"
** Примечание **: файл console.c
и реализует некоторые функции управление вводом/выводом на консоли, ничего необычного. Как вы видите, он также компилируется отдельно.
Теперь, когда я печатаю make client
, все хорошо и птицы подписывают, и т.д. и т.п. Но когда я печатаю make server
, он выплевывает
sgbd_server.c: In function ‘open_server_pipe’:
sgbd_server.c:7: warning: implicit declaration of function ‘pipe_open’
sgbd_server.c: In function ‘close_server_pipe’:
sgbd_server.c:14: warning: implicit declaration of function ‘pipe_close’
Я бег GCC на amd64 Linux, если это имеет значение (я сомневаюсь).
Теперь, почему это предупредило меня об этом? Две функции объявлены в common.h
, который включен в sgbd_server.h
... Что мне здесь не хватает?
Благодарим вас за внимание!
** UPDATE **
Спасибо всем за ваше предложение. Я попытался найти, будет ли файл common.h
где-то еще в моем включенном пути, который будет включен каким-то образом ... Хотя я не смог найти ни одного, который мог бы ускользнуть в процессе компиляции вместо локального common.h
(sig) Я нашел несколько файлов .ghc
, сидящих в моей исходной папке. Так как они не очищены make clean
, я вручную удалил эти файлы. Угадай, что? Нет предупреждения. Что это за файлы и почему они созданы?
Помогает ли это '#inclde" common.h "' в sgbd_server.c? – vpit3833
Я не вижу никаких причин для этого. Как выглядит sgbd_client.c? –
Попробуйте использовать 'gcc -E sgbd_server.c', чтобы увидеть, что именно компилируется после завершения препроцессора. – caf