gcc失败了"未定义的引用"在Cygwin中,但引用存在于链接库中

时间:2015-05-17 20:45:54

标签: c gcc linker

我在Cygwin中构建并安装了libmarpa,最终结果在/usr/local/lib/libmarpa.a

我有一个简单的文件:

#include "libmarpa/dist/marpa.h"

int main() {
  return marpa_check_version(8, 3, 0);
}

但是链接器找不到marpa_check_version

$ gcc test.cc -L/usr/local/lib -lmarpa
/tmp/ccdYM1vV.o:test.cc:(.text+0x1e): undefined reference to `marpa_check_version(int, int, int)'
/tmp/ccdYM1vV.o:test.cc:(.text+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `marpa_check_version(int, int, int)'
collect2: error: ld returned 1 exit status

但该符号作为函数存在:

$ nm /usr/local/lib/libmarpa.a | grep marpa_check_version
0000000000002780 T marpa_check_version

那么这里发生了什么?尝试在Cygwin中执行此操作是否有问题,或者我是否错误地调用了gcc?

1 个答案:

答案 0 :(得分:2)

此符号:

undefined reference to `marpa_check_version(int, int, int)'

是C ++ mangled。此符号不是:

0000000000002780 T marpa_check_version

问题是marpa.h开发人员不希望他们的代码被C++使用,并且没有为此提供适当的保护。您可以像这样解决问题:

extern "C" {
#include "libmarpa/dist/marpa.h"
}

int main() { ...as before ...

P.S。您还应该更改命令行以使用g++而不是gcc。与流行的看法相反,他们不是同样的事情。