Ошибки связи при использовании G ++ для кода MPI - PullRequest
1 голос
/ 23 июня 2011

Мой код так прост:

#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 ++, потому что его проще автоматизировать, поэтому я попытался:

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

Что делает automake, когда добавляет LDFLAGS, 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 ++ - версия g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 mpi is mvapich2

1 Ответ

1 голос
/ 23 июня 2011

Я действительно не помню, может быть, начиная с версии 4, библиотека для связи с -l должна передаваться после всех исходных и объектных файлов.

...