はい、この質問は何度も聞かれました。私はフォーラムや SO の投稿を探して読んでいますが、回答はすべてこれとは無関係です (またはそう思われます)。だから、私はこのメインファイルを持っています:
-- 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
で定義されている2 つの関数は、基本的にとpipe.c
を返します。この最後のファイルは、Make ファイルで個別にコンパイルされます。0
void
私は 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
は、コンソールの I/O を制御するためのいくつかの関数を実装しています。ご覧のとおり、これも個別にコンパイルされています。
今、私が入力する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’
違いがある場合は、Linux amd64でGCCを実行しています(疑わしい)。
さて、なぜそれについて私に警告するのでしょうか? 2 つの関数はcommon.h
、に含まれている で宣言されsgbd_server.h
ています。
お時間をいただきありがとうございます!
**更新**
ご提案いただきありがとうございます。common.h
インクルードパスのどこかに何らかの形で含まれるファイルがあるかどうかを見つけようとしました...ローカルcommon.h
(sig)の代わりにコンパイルプロセスでスリップしたファイルを見つけることができませんでしたが、いくつかの.ghc
ファイルを見つけましたソースフォルダーに座っています。これらは によってクリーンアップされていないため、make clean
これらのファイルを手動で削除しました。何だと思う?警告なし。これらのファイルとは何ですか?なぜ作成されるのですか?