g ++链接到静态库

时间:2014-01-06 21:20:51

标签: c++

我的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

2 个答案:

答案 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