不管,弄了好久終於搞定了!決定來note一下...
首先是$SPRNG_20$/make.CHOICES
PLAT = INTEL
#ix86系列的...
#MPIDEF = -DSPRNG_MPI
#我是編Non-MPI version
PMLCGDEF = -DUSE_PMLCG
GMPLIB = -lgmp
#先降寫,如果是自己裝GMP應該不是放在/usr/lib
LIB_REL_DIR = lib
#libgmp.a的位置,先用預設...
接下來確認一下GMP(libgmp)有沒有裝,如果沒有就到/usr/ports/math/libgmp4裝一下吧!裝好東西會分別被丟在/usr/local/include和/usr/local/lib。
因為make.CHOICES中設定的關係(-lgmp),所以要把/usr/local/lib底下libgmp相關的東西丟到/usr/lib底下,建議用symbolic link來達成。同樣地,/usr/local/include底下libgmp相關的也先弄到/usr/include底下吧,下面會解釋為什麼!
$ ln -s /usr/local/lib/libgmp.a /usr/lib/libgmp.a
$ ln -s /usr/local/lib/libgmp.la /usr/lib/libgmp.la
$ ln -s /usr/local/lib/libgmp.so7 /usr/lib/libgmp.so
$ ln -s /usr/local/lib/libgmp.so7 /usr/lib/libgmp.so7
$ ln -s /usr/local/include/gmp.h /usr/include/gmp.h
$ ln -s /usr/local/include/gmpxx.h /usr/include/gmpxx.h
再來就確認一下$SPRNG_20$/SRC/make.$PLAT$ (eg., make.INTEL)
#If your system does not have ranlib,
#then replace next statement with
#RANLIB = echo
RANLIB = ranlib
# Set f77 to echo if you do not have a FORTRAN compiler
#F77 = g77
F77 = echo
#上面這兩項確認一下,我沒有FORTRAN,所以把F77改成echo...
#MPIF77 = mpif77
#MPICC = mpicc
#MPIDIR = -L/usr/local/mpi/build/LINUX/ch_p4/lib
#MPILIB = -lmpich
#因為我是編Non-MPI version,怕麻煩就把MPI相關的都mark起來了...
完成了?對我而言還沒啊... 在下了make以後,就噴了這樣怪怪的訊息
In file included from pmlcg.c:67:
longlong.h:443: error: syntax error before '%' token
longlong.h:443: error: missing terminating " character
pmlcg.c:76: error: syntax error before "int"
pmlcg.c: In function `iterate':
pmlcg.c:416: error: missing terminating " character
pmlcg.c:416: error: syntax error before ';' token
...
到了$SPRNG_20$/SRC/pmlcg/longlong.h的443行一看,赫然暈倒!居然是組語 Orz 硬try的結果發現,應該要改成這樣↓
__asm__ ("addl %5,%1\n\tadcl %3,%0" \
: "=r" ((USItype)(sh)), \下面449行那邊也是...
__asm__ ("subl %5,%1\n\tsbbl %3,%0" \
: "=r" ((USItype)(sh)), \OK了?想太多... 如果這樣下make的話,會噴
...
#一大堆err msg,都捲出頁面了...
../lib/libsprng.a(pmlcg.o)(.text+0x185e): \
In function `pmlcg_free_rng':
: undefined reference to `mpz_clear'
*** Error code 1
找一找才發現,$SPRNG_20$/SRC/pmlcg/底下居然也有個gmp.h,而這個gmp.h被$SPRNG_20$/SRC/pmlcg/pmlcg.c使用(#include "gmp.h")。太誇張了,這怎麼可能跟自己裝的libgmp合呢?於是把"gmp.h"改成<gmp.h>,這也是為什麼剛也要把/usr/local/include中的gmp.h也丟到/usr/include去的原因。
終於可以下make了!完成後記得用$SPRNG_20$/checksprng確認一下有沒有編正確喔... 編好的libraries在$SPRNG_20$/lib,而include在$SPRNG_20$/include,如果想要讓大家都可以使用,那就sudo cp一下吧 :D
2 comments:
太暴力了啦, 不用symbolic link啊, 加個linker的option就好了.
在make.CHOICES裡面 GMPLIB寫成這樣就好了 (假設你的libgmp的東西放這)
GMPLIB = -L/usr/local/lib -lgmp
哦... 我一開始寫成了
GMPLIB = "-L/usr/local/lib -lgmp"
似乎就不大妙... XD
不過include gmp.h的問題,還是得弄吧!反正只是“symbolic”呀... :P
Post a Comment