我正在尝试使用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
我不明白为什么会得到这个文件的错误-当我尝试为x86_64构建时使用它(看起来是crc/crc32c-arm64.c(在configure选项中使用))。它查找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
,并对其include和library路径进行调整,以将其与主机include和library生态系统(假定基于glibc)隔离。包括主机系统的内核头文件。如果要对musl-gcc
使用任何库(包括诸如内核头之类的“仅头文件的库”),则需要针对musl而非glibc构建一个版本,并将其安装在musl include/library路径中。
对于内核头文件,它们实际上并不依赖于libc或具有任何库文件。这只是标题。因此,您可以通过将linux
,asm
和asm-generic
目录从/usr/include
复制(或符号链接(symbolic link))到musl include dir来实现。或者,您可以从内核源代码安装它们。
但是,如果您发现需要大量第三方库,则删除musl-gcc
并使用真正的交叉编译器会更有意义。如果您愿意从musl.cc信任它们,或者可以使用musl-cross-make构建自己的二进制文件(如今在典型的系统上大约需要15分钟),则可以获取预编译的二进制文件。这将自动为您提供内核头文件,以及一整套GCC目标库,可让您构建C++软件,使用OpenMP的软件等。