2011-06-23 215 views
1

我的代碼是如此簡單:鏈接錯誤

#include <mpi.h> 
int main(int argc, char**args) { 
    MPI_Init(&argc, &args); 
    int mpiSize; 
    int mpiRank; 
    MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); 
    MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank); 
    MPI_Finalize(); 
} 

我第一編譯到對象文件:

g++ -c src/mpitest.cpp -o src/mpitest.o 

然後,我可以很容易地使用mpicxx:

mpicxx src/mpitest.o -o mpi 

但我想用g ++代替,因爲它對automake來說比較容易,所以我試過了:

mpicxx src/mpitest.o -o mpi -show 

它打印出:

g++ src/mpitest.o -o mpi -I/usr/local/include -L/usr/local/lib -L/usr/local/lib -lmpichcxx -lmpich -lopa -lpthread -lrt 

是的,這命令實際上成功地做同樣的事情。但是,如果我試圖將其更改爲(我只是改變了目標文件,並輸出到年底):

g++ -I/usr/local/include -L/usr/local/lib -L/usr/local/lib -lmpichcxx -lmpich -lopa -lpthread -lrt src/mpitest.o -o mpi 

這是當它增加了LDFLAGS的automake做什麼,在G ++開始抱怨......

src/mpitest.o: In function `main': 
..src/mpitest.cpp:5: undefined reference to `MPI_Init' 
../src/mpitest.cpp:8: undefined reference to `MPI_Comm_size' 
../src/mpitest.cpp:9: undefined reference to `MPI_Comm_rank' 
../src/mpitest.cpp:10: undefined reference to `MPI_Finalize' 
collect2: ld returned 1 exit status 

g ++會發生什麼情況?我無法弄清楚。請賜教。爲什麼這裏的訂單很重要?什麼是從一開始就做我想要的正確方法?

非常感謝

P/S:G ++ --version G ++(Ubuntu的4.4.3-4ubuntu5)4.4.3 MPI是MVAPICH2

回答

1

我真的不記得了,也許因爲版本4,與-l鏈接的庫必須在所有源文件和目標文件之後傳遞。

+0

是的,訂單確實很重要!我只是在這裏找到它:http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html – w00d