我正在从源代码构建多个库,已在最新版本中签出。我确定我已经安装了这些库的所有依赖项。我使用的工具可以在其他系统中正确生成库,并正确安装它们所需的依赖项。但是,在当前的构建机器上,我可以配置和编译一堆库,但是当我尝试从源代码编译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 \“”,它可能导致字符串作为单独的参数被读取。我不明白为什么这会在某些系统上而不是在其他系统上通过。
答案 0 :(得分:1)
我只想了解此错误的本质
gcc被要求编译或可能与命令行链接,其中 指定了一个文件,可能是通过一个变量,其名称用引号引起来 形式的字符串:
"<something> 0"
这行不通,因为gcc解析了两个命令行参数:
"<something>
和
0"
例如:
$ touch foo.c
$ name="\"foo 0\""
$ gcc -o $name foo.c
gcc: error: 0": No such file or directory
答案 1 :(得分:0)
某些项目有时会使用以下格式的程序包名称字符串进行配置:PACKAGE_STRING =“ $ packagename $ version”,中间有空格。此空白可能会导致无法正确终止,因此gcc会将整个字符串解释为两个单独的命令。然后,解决方案是在输入configure.ac中修补名称,或者如果它已经是预先配置的项目,则将名称字符串修补为不带空格或格式正确的空格。