0

並列計算を行うために、Linux マシン (CentOS 6.4) に MPICH (ver 3.0.4) をインストールしました。このコマンドで MPICH インストールをテストするために、「pmandel.c」(例として MPICH インストール パッケージに付属) をコンパイルしようとしました。

mpicc pmandel.c -o pmandel.out

しかし、次のエラーが返されます。

pmandel.c: In function ‘main’:
pmandel.c:279: warning: passing argument 2 of ‘bind’ from incompatible pointer type
/usr/include/sys/socket.h:115: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
pmandel.c:282: warning: passing argument 2 of ‘bind’ from incompatible pointer type
/usr/include/sys/socket.h:115: note: expected ‘const struct sockaddr *’ but argument is of type ‘struct sockaddr_in *’
pmandel.c:296: warning: passing argument 2 of ‘getsockname’ from incompatible pointer type
/usr/include/sys/socket.h:119: note: expected ‘struct sockaddr * __restrict__’ but argument is of type ‘struct sockaddr_in *’
/tmp/cclNv8nA.o: In function `exponential_complex':
pmandel.c:(.text+0x2fc2): undefined reference to `exp'
pmandel.c:(.text+0x2fd1): undefined reference to `cos'
pmandel.c:(.text+0x2fe5): undefined reference to `sin'
/tmp/cclNv8nA.o: In function `absolute_complex':
pmandel.c:(.text+0x3330): undefined reference to `sqrt'
collect2: ld returned 1 exit status

出力は行われません。「mpic++」、「mpiCC」、「mpicxx」も試しましたが、すべて役に立ちませんでした。

これを修正するにはどうすればよいですか?

4

1 に答える 1

1

@Spiros は、mpicc に -lm を追加する必要があることは正しいです。コマンドのどこで指定するかも重要です。

「コマンドのどこにこのオプションを記述するかによって違いが生じます。リンカは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。したがって、'foo.o -lz bar.o' は、ファイル foo の後にライブラリ 'z' を検索します。 .o ただし、bar.o の前。bar.o が 'z' 内の関数を参照する場合、それらの関数はロードされない可能性があります。"

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlを参照してください。

pmandel.out の後に来ます。

mpicc pmandel.c -o pmandel.out -lm

または、mpich の例のディレクトリに含まれている Makefile を使用して、次のように入力することもできます。

make pmandel
于 2013-09-09T21:58:27.533 に答える