如何在C ++中链接程序

时间:2013-06-06 14:36:43

标签: c++

我的代码是:

TEST.CPP

#include<iostream>
#include<boost/bind.hpp>
#include "extern.h"
using namespace std;
using namespace boost;
int fun(int x,int y){return x+y;}
/*
 *void add(int &m,int &n);
 */
int main(){
    int m=1;int n=2;
    cout << m << "  "<< n << endl;
    add(m,n);
    cout << m << "  "<< n << endl;
    return 0;

}

extern.h:

#include<iostream>
#include<boost/bind.hpp>
using namespace std;
using namespace boost;
void add(int &n,int &m);

extern.cpp:

#include<iostream>
#include<boost/bind.hpp>
using namespace std;
using namespace boost;

extern int m;
extern int n;

void add(int &n,int &m) {
    n = n+1;
    m = m+1;
}

当我用

编译它时
g++ -Wall -o test test.cpp

原来是:

/tmp/ccMHVRNo.o: In function `main':
test.cpp:(.text+0x7b): undefined reference to `add(int&, int&)'
collect2: ld returned 1 exit status

但是当我用:

编译它时
g++ -Wall -o test test.cpp extern.cpp

效果很好:

$ ./test
1  2
2  3

原因是test.cpp无法找到add()函数的实现。

但我已将extern.h添加到test.cpp,为什么它仍然会说“add(int&, int&)的未定义引用”?

3 个答案:

答案 0 :(得分:3)

函数void add(int&,int&)的实现位于源文件extern.cpp中。在你说出来之前,编译器无法知道这些文件与程序有关。

您必须在命令行中指定所有源文件:

g++ -Wall -o test test.cpp extern.cpp

如果要避免编译所有源文件,还可以指定已编译的目标文件:

g++ -Wall -o test test.cpp extern.o

如果您不想每次都需要编译需要编译的命令,则应使用make并使用规则创建Makefile来定义目标的构建方式。使用makefile,你可以开始

make

并获得结果。

答案 1 :(得分:3)

标题文件extern.h仅告诉您的程序如何创建函数的原型。链接器需要函数的实际实现,因此它会查找代码add(int&,int&)引用,除非您向编译器提供所需的所有文件(在本例中为extern.cpp),否则无法找到它是查找add函数时链接器所需的文件。

答案 2 :(得分:1)

这是通常的公式:

g++ -Wall -c test.cpp
g++ -Wall -c extern.cpp
g++ -o test test.o extern.o

有一个单行,但这些不适合大型项目。