gcc 在 Cygwin 中失败并显示 "undefined reference",但引用存在于链接库中
gcc fails with "undefined reference" in Cygwin, but the reference exists in a linked library
我已经在 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?
这个符号:
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
。与流行的看法相反,它们不是同一件事。
我已经在 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?
这个符号:
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
。与流行的看法相反,它们不是同一件事。