每次升级 Xcode 时,我都会遇到安装了 Brew 的 GCC 的链接器错误

2024-04-28

因此,我升级到 Mavericks 以及最新版本的 Xcode (5.02),并且正如预期的那样,无法编译任何包含 C 扩展的新 Ruby gem。这种情况尤其发生在我自己的项目 NMatrix 中,其中包含 C 和 C++ 代码。

我重新安装了 Xcode 的命令行工具。然后我升级了自制程序。然后我卸载了 rbenv、ruby-build 和我的自定义 GCC 版本(4.7 除外,它是手动安装的,而不是通过 brew 安装的)。

接下来,我使用brew 安装gcc48(以及gcc49,以达到更好的效果)。我指示我的 gem 使用 GCC-4.8.2 而不是 GCC 4.9 的开发快照进行构建。

好消息是我的 gem 现在可以正确编译了。坏消息是它不会链接。这只是链接步骤:

$ bundle exec rake compile
cd tmp/x86_64-darwin13.0.0/nmatrix/2.0.0
make
linking shared-object nmatrix.bundle
ld: warning: directory not found for option '-L/usr/lib64/atlas'
0  0x10ef3f724  __assert_rtn + 144
1  0x10ef7425e  archive::File<x86_64>::makeObjectFileForMember(archive::File<x86_64>::Entry const*) const + 1118
2  0x10ef73c3b  archive::File<x86_64>::justInTimeforEachAtom(char const*, ld::File::AtomHandler&) const + 139
3  0x10ef883fe  ld::tool::InputFiles::searchLibraries(char const*, bool, bool, bool, ld::File::AtomHandler&) const + 210
4  0x10ef8f181  ld::tool::Resolver::resolveUndefines() + 189
5  0x10ef911a5  ld::tool::Resolver::resolve() + 79
6  0x10ef3fb17  main + 669
A linker snapshot was created at:
    /tmp/nmatrix.bundle-2013-10-15-085036.ld-snapshot
ld: Assertion failed: (memberIndex != 0), function makeObjectFileForMember, file /SourceCache/ld64/ld64-224.1/src/ld/parsers/archive_file.cpp, line 355.
collect2: error: ld returned 1 exit status
make: *** [nmatrix.bundle] Error 1
rake aborted!
Command failed with status (2): [make...]

这很奇怪,有几个原因。

  1. 这是一个偶发错误。我们已经见过几次了,但它似乎总是因为不明原因消失。

  2. 我不认为ld: warning线是相关的,但也可能是。 ATLAS是由Xcode的Accelerate框架提供的,在当前版本的Xcode中,它似乎不再位于/usr/lib64/atlas(或者也许从来都不是)。该路径只是可能的安装位置之一,正确的路径(/usr/local/atlas) 已正确包含在内。

  3. 当我搜索上面给出的函数原型时,我看到了很多 LLVM 的东西。都是 Mac OS X 错误。所以这是 Mac 特定的。但为什么当我提供 GCC 时它还要使用 LLVM 呢?它是否使用正确版本的 GCC 进行编译,但尝试链接到错误版本?

最后一个可能是最好的假设。这个错误似乎只出现在无法覆盖默认 GCC 安装的计算机(即 Mac)上。

我无法安装新的 ATLAS,因为没有已知的方法可以关闭 MacBook Air 上的节流功能(这是安装 ATLAS 的先决条件),因此我无法消除ld警告。

有谁知道这些错误可能意味着什么?编译器/链接器专家?任何人?

Update我突然想到要进去看看mkmf.log,我还找到了一些额外的信息。果然是ATLAS问题。但我不太确定为什么它只在一个目录中查找。

ld: warning: directory not found for option '-L/usr/lib64/atlas'
Undefined symbols for architecture x86_64:
  "_ATL_dgemm", referenced from:
      _cblas_dgemm in libcblas.a(cblas_dgemm.o)
  "_ATL_dsyreflect", referenced from:
      _cblas_dgemm in libcblas.a(cblas_dgemm.o)
  "_ATL_dsyrk", referenced from:
      _cblas_dgemm in libcblas.a(cblas_dgemm.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <cblas.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int t(void) { void ((*volatile p)()); p = (void ((*)()))cblas_dgemm; return 0; }
 8: int main(int argc, char **argv)
 9: {
10:   if (argc > 1000000) {
11:     printf("%p", &t);
12:   }
13:
14:   return 0;
15: }
/* end */

"gcc -o conftest -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/x86_64-darwin13.0.0 -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0/ruby/backward -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include/ruby-2.0.0 -I../../../../ext/nmatrix -I/usr/local/atlas/include -I/usr/include/atlas -Wall -Werror=return-type -I/Users/jwoods/.rbenv/versions/2.0.0-p247/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT   -Wall -Werror=return-type  -O3 -Wno-error=shorten-64-to-32  -pipe conftest.c  -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib -L/usr/local/atlas/lib -L/usr/local/lib -L/usr/lib -L/usr/lib64/atlas -L. -L/Users/jwoods/.rbenv/versions/2.0.0-p247/lib  -L/usr/local/lib    -lcblas -llapack  -lruby-static -lcblas -llapack  -lpthread -ldl -lobjc "
conftest.c:7:27: error: too few arguments to function call, expected 14, have 0
int t(void) { cblas_dgemm(); return 0; }
              ~~~~~~~~~~~ ^
/usr/local/atlas/include/cblas.h:470:1: note: 'cblas_dgemm' declared here
void cblas_dgemm(const enum CBLAS_ORDER Order, const enum CBLAS_TRANSPOSE TransA,
^
1 error generated.
checked program was:
/* begin */
 1: #include "ruby.h"
 2:
 3: #include <cblas.h>
 4:
 5: /*top*/
 6: extern int t(void);
 7: int t(void) { cblas_dgemm(); return 0; }
 8: int main(int argc, char **argv)
 9: {
10:   if (argc > 1000000) {
11:     printf("%p", &t);
12:   }
13:
14:   return 0;
15: }
/* end */

我相信我找到了答案。 lib 搜索目录之一extconf.rb(生成 Makefile)是/usr/lib64/,系统上不存在。因此,一旦我将其从搜索路径中删除,它就会正确编译和链接。

我还添加了一个条目$libs定义可能有用也可能没用。

它从存在$libs += " -llapack -lcblas -latlas " to:

$libs += " -llapack -lclapack -lcblas -latlas "

但最后一点解决了链接后的问题,而不是链接期间的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每次升级 Xcode 时,我都会遇到安装了 Brew 的 GCC 的链接器错误 的相关文章

随机推荐

  • 为什么 PS1 不更新 git 分支名称?

    PS1 w git branch grep cut b 3 100 我按上面设置我的 PS1 但在我更改分支后 它不会更新提示中的分支名称git checkout 或使用以下命令更改存储库cd 如何解决这个问题 当反引号引用位被评估时PS1
  • 根据 pandas 中其他数据帧的值更改一个数据帧的值

    我有一个数据框 df1 id value 1 100 2 100 3 100 4 100 5 100 我有另一个数据框 df2 id value 2 50 5 30 我想用 df1 中的值替换 df2 中 id 的这些值 最终修改后的df1
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • 编译时检查函数是否使用/未使用 C++

    我想在编译时检查是否有某些函数某堂课使用 未使用 相应地使编译过程失败 通过 例如如果函数F1在代码中的某处调用我希望编译成功 并且 if 函数F2称为我希望它失败 关于如何使用预处理器 模板或任何其他 C 元编程技术来做到这一点 有什么想
  • 视频作为网站背景? HTML 5

    我想使用视频作为背景 而不是自动拉伸到整个屏幕 背景 的图像 我还想旋转视频和图像 以便以任何顺序显示随机视频 图像 如果知道如何延迟视频播放 以便视频在网站加载后 30 秒只播放一次 那就太好了 thx 看看我的 jquery video
  • java.lang.IllegalArgumentException:在 Servlet 映射中生成无效的

    我遵循了这个问题的解决方案在 Java 构建路径上找不到超类 javax servlet http HttpServlet https stackoverflow com questions 22756153 the superclass
  • 基于 MySQL 中的另一列创建计算列

    我的表中有 2 列 varchar 8 and an int 我想要auto increment the int column当我这样做时 我想将值复制到varchar 8 column 但用 0 填充它直到它达到 8 个字符长 因此例如
  • jQuery mobile 在 Opera Mini 浏览器中失败。如何获得错误输出?

    I have a jQuery Mobile http en wikipedia org wiki JQuery Mobile website that works great on normal browsers but it fails
  • android 将自定义字体设置为油漆

    我想在油漆上绘制文字 如何用自定义字体绘制它 前 Helvetica 并且还粗体 我更愿意使用系统字体而不是从资源创建它 谢谢 如果 自定义字体 是指作为资源提供的字体 则以下代码应该有效 Typeface plain Typeface c
  • Java 压缩字符串

    我需要创建一个接收字符串并返回字符串的方法 防爆输入 AAABBBCCC 防爆输出 3A4B2C 好吧 这很尴尬 我在今天的面试中无法做到这一点 我正在申请初级职位 现在 我在家尝试制作一些静态工作的东西 我的意思是 不使用循环有点无用 但
  • 人们应该选择 ImmutableDictionary 还是 ImmutableSortedDictionary?

    我听说 NETSystem Collections Immutable集合被实现为平衡二叉树 以满足其不变性约束 甚至是传统上对哈希表进行建模的集合 例如Dictionary 通过使用积分值GetHashCode作为排序键 如果我有一种类型
  • 如何从 Jenkins 文件调用 groovy 脚本?

    我正在尝试将 Jenkinsfile 中的内容分离成一个常规脚本来制作 但它无法调用这些脚本 这是代码 usr bin env groovy node test node stage Checkout echo BRANCH NAME en
  • Python ctypes:SetWindowsHookEx 回调函数从未被调用

    我正在尝试用 Python 编写一个程序 该程序可以识别何时显示警报框 对话框 它正在处理多个监视器 我希望它在任务栏图标闪烁 弹出错误 通知等时在辅助监视器上显示可视化效果 据我所知 检测这些事件的方法是使用消息挂钩 如下所述 http
  • 使用本地 SQlite 数据库填充可扩展列表视图的方法

    我的应用程序中有一个 sqlite 数据库 我想用它制作一个可扩展的列表视图 我已经确定了我应该采取的方法 尝试了很多方法来找到相同的教程 但找不到一个使用本地数据库填充可扩展列表的教程 Android 网站上有一个教程 他们使用手机中的联
  • 可选地支持模板的initializer_list构造可能包装容器

    如果我有一个包装标准容器的模板 似乎我可以相当轻松地委托初始化器列表构造函数 template
  • 反应光滑的幻灯片高度问题

    我无法让这些 React Slick 滑块组件达到相同的高度 它们都是响应式 div 并随着页面大小的变化相应地调整大小 但理想情况下 我希望左侧的 div 与右侧的 div 具有相同的高度 我使用下面的代码片段定义了 SimpleSlid
  • 插入到表中并在 SQL 中拆分字符串

    我想将分割字符串插入到我的表中 如您所见 create table Organization organizationId bigint provienceId bigint CityId bigint TownId bigint Inse
  • Objective-C 有没有办法捕获发送到 nil 的消息?

    我刚刚被一种烦人的东西咬了bug https stackoverflow com questions 913627 uiviewcontroller viewdidload not being calledObjective C 中的 向
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • 每次升级 Xcode 时,我都会遇到安装了 Brew 的 GCC 的链接器错误

    因此 我升级到 Mavericks 以及最新版本的 Xcode 5 02 并且正如预期的那样 无法编译任何包含 C 扩展的新 Ruby gem 这种情况尤其发生在我自己的项目 NMatrix 中 其中包含 C 和 C 代码 我重新安装了 X