链接到外部库时,符号名称中的下划线

时间:2012-01-20 14:49:06

标签: c xcode static-linking mex

我正在尝试编译一个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.

1 个答案:

答案 0 :(得分:0)

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

因此,库中缺少gfsOpen()或者它不可见,或者在链接gfs_tester.o时无法看到它。

因此请检查gfsOpen是否在库中。这应该这样做

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

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

检查它是否未声明为static

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