c - 针对 musl-gcc 编译 fio 的问题

标签 c linux gcc glibc musl

我正在尝试构建 FIO使用 musl-gcc (由于 glibc 的许可问题,我们需要使用 musl)。我正在尝试使用 musl 提供的头文件而不是 glibc,但到目前为止编译 FIO 没有成功。我首先使用这些选项运行配置:

my@desktop % ./configure --cc="/usr/local/musl/bin/musl-gcc -I/usr/local/musl/include" --cpu="x86_64" --prefix="/usr/bin"
Operating system              Linux
CPU                           x86_64
Big endian                    no
Compiler                      /usr/local/musl/bin/musl-gcc -I/usr/local/musl/include
Cross compile                 no

Static build                  no
Wordsize                      64
zlib                          no
Linux AIO support             no
POSIX AIO support             yes
POSIX AIO support needs -lrt  no
POSIX AIO fsync               yes
POSIX pshared support         yes
Solaris AIO support           no
__sync_fetch_and_add          yes
__sync_synchronize            yes
__sync_val_compare_and_swap   yes
libverbs                      no
rdmacm                        no
asprintf()                    yes
vasprintf()                   yes
Linux fallocate               no
POSIX fadvise                 yes
POSIX fallocate               yes
sched_setaffinity(3 arg)      yes
sched_setaffinity(2 arg)      no
clock_gettime                 yes
CLOCK_MONOTONIC               yes
CLOCK_MONOTONIC_RAW           yes
CLOCK_MONOTONIC_PRECISE       no
clockid_t                     yes
gettimeofday                  yes
fdatasync                     yes
sync_file_range               no
EXT4 move extent              yes
Linux splice(2)               yes
GUASI                         no
libnuma                       no
strsep                        yes
strcasestr                    yes
strlcat                       yes
getopt_long_only()            yes
inet_aton                     yes
socklen_t                     yes
__thread                      yes
RUSAGE_THREAD                 yes
SCHED_IDLE                    yes
TCP_NODELAY                   yes
Net engine window_size        yes
TCP_MAXSEG                    yes
RLIMIT_MEMLOCK                yes
pwritev/preadv                yes
pwritev2/preadv2              no
IPv6 helpers                  yes
http engine                   no
Rados engine                  no
Rados Block Device engine     no
setvbuf                       yes
Gluster API engine            no
s390_z196_facilities          no
HDFS engine                   no
MTD                           no
libpmem                       no
libpmemblk                    no
PMDK pmemblk engine           no
PMDK dev-dax engine           no
PMDK libpmem engine           no
DDN's Infinite Memory Engine  no
iscsi engine                  no
lex/yacc for arithmetic       no
getmntent                     yes
getmntinfo                    no
Static Assert                 no
bool                          yes
strndup                       yes
Valgrind headers              no
Zoned block device support    no
march_armv8_a_crc_crypto      no
cuda                          no
mkdir(a, b)                   yes
Build march=native            no
CUnit                         no
__kernel_rwf_t                no
-Wimplicit-fallthrough        no
MADV_HUGEPAGE                 yes
gettid                        no
Consider installing zlib-dev (zlib-devel, some fio features depend on it.
TCMalloc support              no

然后运行 ​​make:

my@desktop % make
    CC crc/crc16.o
    CC crc/crc32.o
    CC crc/crc32c-arm64.o
In file included from crc/../os/os.h:38,
                 from crc/crc32c-arm64.c:2:
crc/../os/os-linux.h:16:26: error: linux/unistd.h: No such file or directory
crc/../os/os-linux.h:17:23: error: linux/raw.h: No such file or directory
crc/../os/os-linux.h:18:25: error: linux/major.h: No such file or directory
crc/../os/os-linux.h:19:22: error: linux/fs.h: No such file or directory
In file included from crc/../os/os.h:38,
                 from crc/crc32c-arm64.c:2:
crc/../os/os-linux.h: In function ‘fio_lookup_raw’:
crc/../os/os-linux.h:175: error: storage size of ‘rq’ isn’t known
crc/../os/os-linux.h:178: error: ‘RAW_MAJOR’ undeclared (first use in this function)
crc/../os/os-linux.h:178: error: (Each undeclared identifier is reported only once
crc/../os/os-linux.h:178: error: for each function it appears in.)
crc/../os/os-linux.h:192: error: ‘RAW_GETBIND’ undeclared (first use in this function)
crc/../os/os-linux.h:175: warning: unused variable ‘rq’
make: *** [crc/crc32c-arm64.o] Error 1

我不明白为什么我得到这个文件的错误 - 它看起来是 crc/crc32c-arm64.c,当我试图为 x86_64 构建时(在配置选项中使用它)。它会查找 linux/*.h,但/usr/local/musl/include 中没有“linux”文件夹。我通过包含/usr/include 来再次运行它(它确实有 linux/*.h),就像这样:

my@desktop % ./configure --cc="/usr/local/musl/bin/musl-gcc -I/usr/include" --cpu="x86_64" --prefix="/usr/bin"

但现在我在运行 make 时遇到了不同的错误:

my@desktop % make
    CC crc/crc16.o
    CC crc/crc32.o
    CC crc/crc32c-arm64.o
    CC crc/crc32c-intel.o
    CC crc/crc32c.o
    CC crc/crc64.o
    CC crc/crc7.o
    CC crc/fnv.o
    CC crc/md5.o
    CC crc/murmur3.o
    CC crc/sha1.o
    CC crc/sha256.o
    CC crc/sha3.o
    CC crc/sha512.o
    CC crc/test.o
In file included from /usr/include/stdio.h:75,
                 from crc/test.c:2:
/usr/include/libio.h:491: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/libio.h:493: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
In file included from crc/test.c:2:
/usr/include/stdio.h:80: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘va_list’
In file included from crc/test.c:2:
/usr/include/stdio.h:371: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:370: warning: conflicting types for built-in function ‘vfprintf’
/usr/include/stdio.h:376: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:376: warning: conflicting types for built-in function ‘vprintf’
/usr/include/stdio.h:379: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:378: warning: conflicting types for built-in function ‘vsprintf’
/usr/include/stdio.h:390: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:389: warning: conflicting types for built-in function ‘vsnprintf’
/usr/include/stdio.h:399: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:417: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:476: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:475: warning: conflicting types for built-in function ‘vfscanf’
/usr/include/stdio.h:483: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:483: warning: conflicting types for built-in function ‘vscanf’
/usr/include/stdio.h:488: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/stdio.h:487: warning: conflicting types for built-in function ‘vsscanf’
In file included from crc/test.c:2:
/usr/include/stdio.h:899: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
In file included from /usr/include/stdio.h:932,
                 from crc/test.c:2:
/usr/include/bits/stdio2.h:28: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:26: warning: conflicting types for built-in function ‘__vsprintf_chk’
/usr/include/bits/stdio2.h:44: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vsprintf’:
/usr/include/bits/stdio2.h:48: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:48: error: (Each undeclared identifier is reported only once
/usr/include/bits/stdio2.h:48: error: for each function it appears in.)
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:58: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:56: warning: conflicting types for built-in function ‘__vsnprintf_chk’
/usr/include/bits/stdio2.h:75: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vsnprintf’:
/usr/include/bits/stdio2.h:79: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:90: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:89: warning: conflicting types for built-in function ‘__vfprintf_chk’
/usr/include/bits/stdio2.h:92: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:91: warning: conflicting types for built-in function ‘__vprintf_chk’
/usr/include/bits/stdio2.h:115: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vprintf’:
/usr/include/bits/stdio2.h:118: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:118: error: too many arguments to function ‘__vfprintf_chk’
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:126: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vfprintf’:
/usr/include/bits/stdio2.h:128: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:128: error: too many arguments to function ‘__vfprintf_chk’
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:137: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:142: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:151: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h:196: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vasprintf’:
/usr/include/bits/stdio2.h:199: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:199: error: too many arguments to function ‘__vasprintf_chk’
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:203: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘vdprintf’:
/usr/include/bits/stdio2.h:205: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:205: error: too many arguments to function ‘__vdprintf_chk’
/usr/include/bits/stdio2.h: At top level:
/usr/include/bits/stdio2.h:209: error: expected declaration specifiers or ‘...’ before ‘__gnuc_va_list’
/usr/include/bits/stdio2.h: In function ‘obstack_vprintf’:
/usr/include/bits/stdio2.h:213: error: ‘__ap’ undeclared (first use in this function)
/usr/include/bits/stdio2.h:213: error: too many arguments to function ‘__obstack_vprintf_chk’
make: *** [crc/test.o] Error 1

使用的版本: musl-1.1.23, fio-3.15, gcc-4.4.6

如果我只使用 glibc,它可以在不使用 musl 的情况下构建得很好。 如何使用 musl 而不是 glibc 成功构建 FIO?这可能吗?

最佳答案

musl-gcc 包装器脚本的全部要点是调用 gcc 并调整包含和库路径以将其与主机包含和库生态系统隔离(假定是基于 glibc 的)。这包括您的主机系统的内核头文件。如果你想在 musl-gcc 中使用任何库(包括像内核头文件这样的“header-only libraries”),你需要构建一个针对 musl 而不是 glibc 的版本并将它安装在 musl include 中/库路径。

对于内核头文件,它们实际上并不依赖于 libc,也没有任何库文件;这只是标题。因此,您可能可以从 /usr/复制(或符号链接(symbolic link))linuxasmasm-generic 目录include 到 musl include 目录。或者,您可以从内核源安装它们。

但是,如果您发现需要大量的第三方库内容,那么放弃 musl-gcc 并使用真正的交叉编译器会更有意义。如果您愿意从 musl.cc 中信任它们,您可以获得预构建的二进制文件。 ,或使用 musl-cross-make 构建您自己的(如今在典型系统上大约需要 15 分钟) .这将自动为您提供内核头文件,以及一整套 GCC 目标库,让您可以构建 C++ 软件、使用 OpenMP 的软件等。

关于c - 针对 musl-gcc 编译 fio 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58245567/

相关文章:

linux - ip路由表基础

c++ - 在 fedora 27 中构建 glfw 时链接期间出错

用于传递多个可变参数的 C 宏

c++ - 在 C/C++ 中,是否可以通过使用指针更改 "important"内存地址的值来创建简单的恶意软件?

linux - 如何检查计划作业的进程ID或进程

python - 如何使用 Python 脚本在 Linux 操作系统中启动裸 X 服务器(X -retro &)?

C/C++ 和 NMBGF 写入二进制文件在 ENDF 之前标记有 intel 标记

c++ - 将 C++ 代码与 C 代码匹配

c++ - 安装WxWidgets时遇到问题

c++ - 区分字符串文字和字符数组