簡體   English   中英

如何在C ++中鏈接程序

[英]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;

}

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&)未定義引用”?

函數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM