0
/*This is a simple try to create a File System in UserSpace 
The pre_init function just initializes the filesystem */
#include<linux/fuse.h>
#include<stdio.h>
#include<stdlib.h>
#include<fuse_lowlevel.h>


static void* pre_init(struct fuse_conn_info *conn, struct fuse_config *cfg){
        printf("[init] called\n");
        (void) conn;
        return NULL;
}
static struct fuse_operations opr = {
        .init = pre_init,
};
int main(int argc, char *argv[]){
        return fuse_main(argc, argv, &opr, NULL);
}

我正在尝试使用gcc sample.c -o sample `pkg-config fuse --cflags --libs` 编译代码,正如我所展示的那样,我在代码中遇到了很多错误

 sample.c:7:59: warning: ‘struct fuse_config’ declared inside parameter list will not be visible outside of this definition or declaration
 static void* pre_init(struct fuse_conn_info *conn, struct fuse_config *cfg){
                                                           ^~~~~~~~~~~
 sample.c:12:15: error: variable ‘opr’ has initializer but incomplete type
 static struct fuse_operations opr = {
               ^~~~~~~~~~~~~~~
 sample.c:13:3: error: ‘struct fuse_operations’ has no member named ‘init’
  .init = pre_init,
   ^~~~
 sample.c:13:10: warning: excess elements in struct initializer
  .init = pre_init,
          ^~~~~~~~
 sample.c:13:10: note: (near initialization for ‘opr’)
 sample.c: In function ‘main’:
 sample.c:16:9: warning: implicit declaration of function ‘fuse_main’; did you mean ‘fuse_mount’? [-Wimplicit-function-declaration]
 return fuse_main(argc, argv, &opr, NULL);
         ^~~~~~~~~
         fuse_mount
 sample.c: At top level:
 sample.c:12:31: error: storage size of ‘opr’ isn’t known
 static struct fuse_operations opr = {
                               ^~~

我还检查了保险丝是否安装正确,因为头文件已包含在内,没有任何问题。但是为什么我不能编译这个简单的代码呢?

4

1 回答 1

1

有两个“保险丝”版本,有时彼此共存:保险丝2和保险丝3。他们不同。在我的 Archlinux 中有两个 fuse 包:fuse2 和 fuse3。在我的系统上,文件/usr/include/fuse.h只包含fuse/fuse.hfuse/fuse.h来自 fuse2 包。标头fuse3/fuse.h来自fuse3。
无论如何,你想在这里使用 fuse3 api,因为你使用struct fuse_config. fuse3 定义struct fuse_config.
但是,最重要的是,在包含任何 fuse 头文件之前定义 FUSE_USE_VERSION 宏,如fuse2 的 fuse.hfuse3的 fuse.h 开头所指定的:

IMPORTANT: you should define FUSE_USE_VERSION before including this header.

gcc -Wall -pedantic -lfuse3 1.c在我的平台上使用以下编译时没有警告/错误:

#define FUSE_USE_VERSION 31
#include <fuse3/fuse.h>
#include <stdio.h>
#include <stdlib.h>

static void* pre_init(struct fuse_conn_info *conn, struct fuse_config *cfg){
        printf("[init] called\n");
        (void) conn;
        return NULL;
}
static struct fuse_operations opr = {
        .init = pre_init,
};
int main(int argc, char *argv[]){
        return fuse_main(argc, argv, &opr, NULL);
}
于 2018-04-11T13:52:37.300 回答