我正在尝试安装C库:ssht
我已经设置了makefile,它肯定会找到依赖项。但是,当我使用gcc制作它时,我会收到一些警告:
In file included from ../ssht/src/c/ssht_core.c:23:0:
../ssht/src/c/ssht_core.c: At top level:
../ssht/src/c/ssht_sampling.h:39:20: warning: inline function ‘ssht_sampling_ind2elm’ declared but never defined
extern inline void ssht_sampling_ind2elm(int *el, int *m, int ind);
然后当我对代码进行测试时,我得到错误:
"_ssht_sampling_elm2ind", referenced from:
_ssht_test_gen_flm_complex.constprop.1 in ssht_test.o
_ssht_test_gen_flm_real in ssht_test.o
_ssht_test_gen_lb_flm_real in ssht_test.o
_ssht_test_gen_flm_complex in ssht_test.o
_ssht_test_gen_lb_flm_complex in ssht_test.o
_main in ssht_test.o
_ssht_core_mwdirect_inverse in libssht.a(ssht_core.o)
...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [../ssht/bin/c/ssht_test] Error 1
我一直无法找到任何我能理解的解决方案。顺便说一句,我的gcc版本是:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-apple-darwin14.4.0/5.1.0/lto-wrapper
Target: x86_64-apple-darwin14.4.0
Configured with: ../gcc-5.1.0/configure --enable-languages=c++,fortran
Thread model: posix
gcc version 5.1.0 (GCC)
我尝试使用-m32作为32位安装进行安装,看看是否有变化,但我在i386而不是x86_64时遇到了同样的错误。
我已将它安装在Linux机器上,我也可以使用makefile访问,除了其中一个依赖项的位置外,该文件是相同的。
请帮忙!
答案 0 :(得分:1)
似乎代码被破坏了,你提出的警告确实是一个很好的线索。该标准规定:
对于具有外部链接的函数,以下限制适用:如果使用
inline
函数说明符声明函数,则它也应在同一个转换单元中定义。如果翻译单元中函数的所有文件范围声明都包含inline
函数说明符而没有extern
,那么该翻译单元中的定义是内联定义。内联定义不提供函数[...]的外部定义。
[C2011,6.7.4 / 7]
警告表示违反了引用的限制:警告中指示的头文件包含给定的函数声明,该声明带有inline
和extern
说明符。由于inline
说明符,C要求出现该声明的每个翻译单元也提供定义;因为它出现在头文件中,所以它适用于包含该头的每个源文件。文件ssht_core.c
包含标题,但未提供定义。
对源的检查表明,指定的函数仅在文件../ssht/src/c/ssht_sampling.c
中定义,但该文件不包含相应的头。当C源文件具有相应的头文件时,包含该头文件是习惯性和有用的,因为这有助于捕获声明之间的差异。但是,这样做并不是强制性的,因此遗漏本身并不是错误的。
但是,在这种情况下,ssht_sampling_ind2elm()
中ssht_sampling.c
的唯一声明是其定义,并且带有inline
说明符而没有extern
。因此,标准的上述部分的第二部分适用:对应于该文件的翻译单元不提供该功能的外部定义。也就是说,它提供的定义只能在同一个翻译单元中显示,而不能从其他翻译单元中看到,例如与ssht_core.c
相关联的翻译单元。
目的似乎是在一个文件中提供一个可以在其他文件中内联的函数定义,但这是不允许的,也不是真的有意义。我会向图书馆的作者提交一份错误报告。一种可能的解决方案是使ssht_sampling.c
包含自己的标题;这不会解决警告,但它应该解决链接问题。您可以通过同时从标头中的函数声明中删除inline
说明符来清除警告。或者,您可以在标头和主源中删除函数中的inline
说明符,而无需更改哪个文件包含在哪个文件中。