我的main.cpp
:
#include <iostream>
int foo(int arg);
using namespace std;
int main()
{
int x = foo(22);
cout << x;
return 0;
}
编译命令行(Ubuntu 13.10):
g++-4.8 -L. -lfoo main.cpp -o main_app
libfoo.a
包含int foo(int)
但我总是得到相同的编译器错误:
/tmp/cciAyTSP.o: In function `main':
main.cpp:(.text+0x19): undefined reference to `foo(int)'
collect2: error: ld returned 1 exit status
答案 0 :(得分:3)
当然,没有可重复的案例,我们无法确定,但一个常见的错误是,如果函数foo
是用C语言编写的,那么你需要把
extern "C" { int foo(int); }
在C ++程序的.h
文件中,让它知道该函数不是用C ++编写的。
要编写一个对C和C ++都有好处的跨语言头文件,通常的方法是
#ifdef __cplusplus
extern "C" {
#endif
... C declarations ...
#ifdef __cplusplus
}
#endif
答案 1 :(得分:0)
除了6502的回答和Xephon的建议外,还要注意选项的顺序很重要。而不是:
g++-4.8 -L. -lfoo main.cpp -o main_app
你应该写:
g++-4.8 main.cpp -o main_app -L. -lfoo
那是因为ld
是单通道链接器。它不会重新访问库libfoo
以使用其中的符号main_app.o
。