What is the nature of the `gcc: error: 0": No such file or directory` error?

What is the nature of the `gcc: error: 0": No such file or directory` error?

我正在从源代码构建多个库,并在最新版本中签出。我确定我已经安装了这些库的所有依赖项。我使用的工具会在其他系统中正确生成库并正确安装所需的依赖项。但是,在我当前的构建机器上,我可以配置和编译一堆库,但是当我尝试从源代码编译 libiconv 和 libsodium 时,gcc 会抛出以下神秘错误:

gcc-7: error: 0": No such file or directory

我不是在寻找这个问题的直接解决方案,我只是想知道这个错误的本质是什么,当它出现在一个成功配置的项目中时。

编辑:运行 的最后一个块是: libtool: compile: gcc -m64 -I../lib -I./../lib -I../include -I./../include -I.. -I./.. -I/home/ubuntu/build/monero/contrib/depends/x86_64-linux-gnu/include -pipe -O2 -fvisibility=hidden -DLIBDIR=\"/home/ubuntu/build/monero/contrib/depends/x86_64-linux-gnu/lib\" -DBUILDING_LIBICONV -DBUILDING_DLL -DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"/home/ubuntu/build/monero/contrib/depends/x86_64-linux-gnu/lib\" -DNO_XMALLOC -Dset_relocation_prefix=libiconv_set_relocation_prefix -Drelocate=libiconv_relocate -DPACKAGE_NAME=\"libiconv\" -DPACKAGE_TARNAME=\"libiconv\" -DPACKAGE_VERSION=\"0\" "-DPACKAGE_STRING=\"libiconv 0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DINSTALLPREFIX=\"/home/ubuntu/build/monero/contrib/depends/x86_64-linux-gnu\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -D__EXTENSIONS__=1 -D_ALL_SOURCE=1 -D_DARWIN_C_SOURCE=1 -D_GNU_SOURCE=1 -D_POSIX_PTHREAD_SEMANTICS=1 -D__STDC_WANT_IEC_60559_ATTRIBS_EXT__=1 -D__STDC_WANT_IEC_60559_BFP_EXT__=1 -D__STDC_WANT_IEC_60559_DFP_EXT__=1 -D__STDC_WANT_IEC_60559_FUNCS_EXT__=1 -D__STDC_WANT_IEC_60559_TYPES_EXT__=1 -D__STDC_WANT_LIB_EXT2__=1 -D__STDC_WANT_MATH_SPEC_FUNCS__=1 -D_TANDEM_SOURCE=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -DHAVE_VISIBILITY=1 -DLIBICONV_PLUG -c ./../lib/iconv.c -fPIC -DPIC -o objects/.libs/iconv.o

令我印象深刻的是 "-DPACKAGE_STRING=\"libiconv 0\"" ,它可能导致字符串被读取为单独的参数。我不明白为什么这会在某些系统上传递而不是在其他系统上传递。

I just want to find out what the nature of this error is

gcc 被要求编译或可能 link 使用命令行,其中 一个文件被指定,可能是通过一个变量,它的名字是用引号引起来的 形式的字符串:

"<something> 0"

这行不通,因为 gcc 解析两个命令行参数:

"<something>

0"

例如:

$ touch foo.c
$ name="\"foo 0\""
$ gcc -o $name foo.c
gcc: error: 0": No such file or directory

有些项目有时会配置包名称字符串,格式为:PACKAGE_STRING="$packagename $version",中间有白色 space。这个白色 space 最终可能没有正确终止,因此 gcc 会将整个字符串解释为两个单独的命令。然后解决方案是修补输入 configure.ac 中的名称,或者如果它已经是一个预配置的项目,则将名称字符串修补为没有 whitespace 或 whitespace 格式正确。