我正在尝试编译一个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.
答案 0 :(得分:0)
这是一个猜测。首先,约阿希姆的评论是正确的。 C函数名称将始终以下划线开头。所以这不是问题。
因此,库中缺少gfsOpen()
或者它不可见,或者在链接gfs_tester.o
时无法看到它。
因此请检查gfsOpen是否在库中。这应该这样做
otool -t -v sgsf_0303/libgsf.a | grep gsfOpen
上面反汇编该文件,然后从中获取您感兴趣的符号。可能有更好的方法,但我没有费心去研究它。
检查它是否未声明为static
。
确保库的架构匹配(otool -fv
)