【发布时间】: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