我的代码是:
#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;
}
#include<iostream>
#include<boost/bind.hpp>
using namespace std;
using namespace boost;
void add(int &n,int &m);
#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&)
的未定义引用”?
答案 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
有一个单行,但这些不适合大型项目。