【问题标题】:Underbars in symbol names when linking against an external library链接外部库时符号名称中的下划线
【发布时间】:2012-01-20 14:49:05
【问题描述】:

我正在尝试编译一个 C 库,然后一些外部 C 代码喜欢它,但我的外部代码在库中查找符号时遇到问题。我不明白大电影,希望有人能提供帮助。以下是详细信息:

1) 我正在使用 Mac。我已将该库编译为 xcode 中的静态 .a 库。

2) 我正在尝试从库中编译外部代码调用函数。我已经包含了头文件,并在 gcc 调用中指定了它的位置和库。编译似乎可以完成,但链接失败,说明找不到符号。

3) 缺少的符号被列为 _FunctionName,其中 FunctionName 是我调用的函数的名称。

我不清楚为什么编译器/链接器在我的函数名称中添加了下划线。但我天真的猜测是这就是为什么在库中找不到符号的原因。

外部代码编译是通过 MATLAB 的 mex() 函数完成的,该函数在后台进行下面的 gcc 调用。

如果有人有任何想法,我将不胜感激。

gcc-4.2 -c  -Igsf_0303/ -I/Applications/MATLAB_R2011b.app/extern/include \
-DMATLAB_MEX_FILE -fno-common -no-cpp-precomp -arch x86_64 -isysroot \
/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5  -fexceptions  \
-DMX_COMPAT_32 -O2 -DNDEBUG  "gsf_tester.c"

gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl, \
-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,\
-exported_symbols_list,/Applications/MATLAB_R2011b.app/extern/lib/maci64/mexFunction.map \
-o  "gsf_tester.mexmaci64"  gsf_tester.o  gsf_0303/libgsf.a \
-L/Applications/MATLAB_R2011b.app/bin/maci64 -lmx -lmex -lmat -lstdc++

Undefined symbols:
  "_gsfOpen", referenced from:
      _mexFunction in gsf_tester.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

mex: link of ' "gsf_tester.mexmaci64"' failed.

【问题讨论】:

  • 你的符号在你的库中有什么名字? (运行nm -g library.a 列出文件 library.a 中所有导出的符号)
  • 添加下划线是编译器在编译时命名 C 函数的常用方法。正如您在错误消息mexFunction 中看到的那样,也有它。您确定包含gfsOpen 的文件确实已添加到库中吗?

标签: c xcode static-linking mex


【解决方案1】:

这是一个猜测。首先,约阿希姆的评论是正确的。 C 函数名称将始终带有下划线。所以这不是问题。

所以gfsOpen() 要么从库中丢失,要么在链接gfs_tester.o 时不可见或不可见。

所以检查 gfsOpen 是否在库中。应该这样做

otool -t -v sgsf_0303/libgsf.a | grep gsfOpen

上述反汇编文件,然后从中获取您感兴趣的符号。可能有更好的方法,但我没有费心去研究它。

检查它没有声明static

确保库的架构匹配 (otool -fv)

【讨论】:

  • 感谢您的快速回复。使用您建议的工具,我发现 gsfOpen 确实不在符号表中。这导致对我实际编译到我的库中的内容进行了进一步调查。我创建了另一段代码来测试该库,当我无意中编译该库时,它已包含在项目的文件列表中。删除它并重新编译后,我能够在 MATLAB 中编译和运行我的函数而不会出错。我不明白我愚蠢的细节,但我很感激它的工作,更感谢你的帮助。
  • @user2932:您可能应该使用您的评论文本为您自己的问题创建一个答案并接受它。这样,任何来这里寻找相同问题答案的人都会更轻松地找到您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2010-10-28
  • 2011-02-27
相关资源
最近更新 更多