【问题标题】:Architecture clash? symbol(s) not found for architecture x86_64 on mac架构冲突?在 Mac 上找不到架构 x86_64 的符号
【发布时间】:2016-07-20 13:54:05
【问题描述】:

我正在尝试安装 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 访问它,除了其中一个依赖项的位置。

请帮忙!

【问题讨论】:

标签: c gcc makefile architecture x86-64


【解决方案1】:

看来代码已损坏,您提供的警告确实是一个很好的线索。该标准规定:

对于具有外部链接的函数,适用以下限制:如果函数使用inline 函数说明符声明,则它也应在同一翻译单元中定义。如果翻译单元中函数的所有文件范围声明都包含inline 函数说明符而没有extern,则该翻译单元中的定义是内联定义。内联定义不为函数 [...] 提供外部定义。

[C2011, 6.7.4/7]

警告表示违反了引用的限制:警告中指示的头文件包含给定的函数声明,该声明带有inlineextern 说明符。由于inline 说明符,C 要求出现该声明的每个翻译单元也提供定义;由于它出现在头文件中,因此适用于包含该头文件的每个源文件。文件ssht_core.c 包含标题但未提供定义。

对源代码的检查表明,指定函数仅在文件../ssht/src/c/ssht_sampling.c 中定义,但该文件不包含相应的头文件。当一个 C 源文件有一个相应的头文件时,包含该头文件是习惯和有用的,因为这有助于发现声明之间的差异。但是,这并不是强制性的,因此省略本身并没有错。

然而,在这种情况下,ssht_sampling_ind2elm()ssht_sampling.c 中的唯一声明是它的定义,它带有一个没有externinline 说明符。因此,上面引用的标准部分的第二部分适用:对应于该文件的翻译单元不提供函数的外部定义。也就是说,它提供的定义仅在同一个翻译单元中可见,而在其他翻译单元中不可见,例如与 ssht_core.c 关联的翻译单元。

其目的似乎是在一个文件中提供可以内联到其他文件中的函数定义,但这是不允许的,也没有真正意义。我会向图书馆的作者提交一份错误报告。一种可能的解决方案是让ssht_sampling.c 包含自己的标题;这不会解决警告,但它应该解决链接问题。您可以通过从标头中的函数声明中删除inline 说明符来清除警告。或者,您可以从标头和主源中的函数中删除 inline 说明符,而不更改哪个标头包含在哪个文件中。

【讨论】:

  • 非常感谢您的详细回复,这修复了警告和错误!我将向作者提交错误报告。
  • 删除 inline 绝对是错误的解决方法,因为它是一个微不足道的功能(OP 在评论中复制了定义)。相反,将定义移动到标题中,函数的所有用户都可以看到定义,而不仅仅是原型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多