[英]How to link a program in C++
我的代碼是:
#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&)
未定義引用”?
函數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
並得到結果。
頭文件extern.h
僅告訴您的程序該函數原型的制作方式。 鏈接器需要函數的實際實現,因此它會查找代碼add(int&,int&)
引用,並且除非找到了所需的所有文件(在這種情況下, extern.cpp
是查找add
功能時鏈接器需要的文件)。
這是通常的公式:
g++ -Wall -c test.cpp
g++ -Wall -c extern.cpp
g++ -o test test.o extern.o
有一個班輪,但那些班輪規模不大。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.