数值计算

星期三, 五月 24, 2006

HP-UX-64.97上的编译链接(1)

64.97上,想写个动态链接库,动态链接,并且自动查找动态链接库:



1、生成动态链接

ld -b -o libcip.so cipcsl2.o cipcsl3.o slope.o cip.o cipcsl4.o +h libcip.so



2、使用

f90 -L/home/math/mathcf/lib -L. -o cip pdedata.o pdedata2d.o main.o calculate.o calculate2d.o init.o init2d.o cip2d.o cipcsl2d.o departpoint2d.o -lcip -lsl -lnr





好象 -L 选项要放在前面,否则就会出错,试了好久 :-《

Makefile写法,在CSDN上

前往

hp-ux多语言链接

HP的参考手册上: (http://docs.hp.com/hpux/onlinedocs/B3909-90014/B3909-90014.html)



32-bit PA-RISC 1.1 code

-L/opt/fortran90/lib/ -lF90 -lisamstub



32-bit PA-RISC 2.0 code

-L/opt/fortran90/lib/pa2.0/ -lF90 -lisamstub



64-bit PA-RISC 2.0 code

-L/opt/fortran90/lib/pa20_64/ -lF90 -lisamstub



还没有试验,等有空试试,然后再说



>man f90

在末端,可以看到,http://www.hp.com/go/hpfortran,然后点 " Documentation

"

同样可以看到aCC的文档:

http://docs.hp.com/hpux/onlinedocs/5076/index.htm

一个较好的.bash_profile文件

在Linux系统下为.bash_profile(/bin/bash),HP-UX下为.profile(/bin/sh):



# .bash_profile



# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi



# User specific environment and startup programs



PS1='\u@\h:$PWD> '

PS1='\u@\h>'

alias cp='cp -ipr'

alias mv='mv -i'

alias rm='rm -i'

alias ls='ls -F --color=tty'

alias ll='ls -Flrt --color=tty'



unset USERNAME



# set PATH so it includes user's private bin if it exists

# PATH=~/bin:"${PATH}"

if [ -d ~/bin ] ; then

if [ -z "${PATH}" ] ; then

PATH=~/bin

else

PATH=~/bin:"${PATH}"

fi

export PATH

fi



# do the same with MANPATH

# MANPATH=~/man:"${MANPATH}"

if [ -d ~/man ]; then

if [ -z "${MANPATH}" ] ; then

MANPATH=~/man:$(man -w)

else

MANPATH=~/man:"${MANPATH}"

fi

export MANPATH

fi



# do the same with LD_LIBRARY_PATH

if [ -d ~/lib ]; then

if [ -z "${LD_LIBRARY_PATH}" ]; then

LD_LIBRARY_PATH=~/lib

else

LD_LIBRARY_PATH=~/lib:"${LD_LIBRARY_PATH}"

fi

export LD_LIBRARY_PATH

fi

mkl库LAPACK包的使用

ifort -o sl solve.o -L/opt/intel/mkl/lib/64 -lmkl_lapack -lmkl_itp



由于使用了动态链接,增加了如下命令:

ln -s /opt/intel/mkl/lib/64/libmkl_itp.so ~/lib/libmkl_itp.so

ln -s /opt/intel/mkl/lib/64/libmkl_lapack.so ~/lib/libmkl_lapack.so



~/lib 在环境变量 LD_LIBRARY_PATH 中



搞定 。 :-》



C语言调用LAPACK包:

ln -s /opt/intel/mkl/include ~/include/mkl



#include "mkl/mkl.h"

我用的makefile

# File name: make.inc

# 放在~/include 下

#

# 在octane中使用本链接库的时候,注意如下的问题 :

# 下面的命令没有问题

# cc -L~/lib -o t test.o -lrnm

# 下面的命令有问题

# cc -L~/lib -o t -lrnm test.o

# WARNING 84: /home/rui/lib/librnm.so is not used for resolving any symbol.

# ERROR 33: Unresolved text symbol "agaus_" -- 1st referenced by test.o.

#

#

# 在HP-UX中使用本链接库的时候,注意如下的问题 :

# 下面的命令没有问题

# cc -L~/lib -o t test.o -lrnm

# 下面的命令有问题

# cc -o t -lrnm test.o -L~/lib

# ERROR 33: Can not find liberary -lrnm

#

HOMEPATH=$(HOME)

# ################################################

# 缺省路径

# ################################################

INCLUDEPATH = $(HOMEPATH)/include

LIBPATH= $(HOMEPATH)/lib



# ################################################

# 编译命令

# ################################################

FOR_COMPLIER = f90

F90_COMPLIER = f90

C_COMPLIER = cc

CPP_COMPLIER = aCC



# ################################################

# 缺省编译选项

# ################################################

DEFINES =

FOR_OPTION = +O3 -I$(INCLUDEPATH) +nouppercase

F90_OPTION = +O3 -I$(INCLUDEPATH) +nouppercase

C_OPTION = +O3 -I$(INCLUDEPATH)

CPP_OPTION = +O3 -I$(INCLUDEPATH)

LINK_OPTION =



# ################################################

# 创建动态链接库

DYN_LIB_CREATER = ld -b

# 创建静态库

STA_LIB_CREATER = ar r



# ################################################

# Fortran的链接库

FORTRAN_LIB = -L/opt/fortran90/lib/ -lF90 -lisamstub



# ################################################

# LAPACK的链接库

LAPACK_LIB = -llapack -lm



# ################################################

FOR_FILES = $(wildcard *.f) $(wildcard *.for) $(wildcard *.f77)

F90_FILES = $(wildcard *.f90)

C_FILES = $(wildcard *.c)

CPP_FILES = $(wildcard *.cc) $(wildcard *.cpp)



FOR_OBJS = $(patsubst %.f,%.o,$(patsubst %.for,%.o,$(patsubst %.f77,%.o,$(FOR_FILES))))

F90_OBJS = $(patsubst %.f90,%.o,$(F90_FILES))

CPP_OBJS = $(patsubst %.cc,%.o,$(patsubst %.cpp,%.o,$(CPP_FILES)))

C_OBJS = $(patsubst %.c,%.o,$(C_FILES))





# ################################################

# You can define followed parameter yourself

# ################################################

MY_DEFINES =

MY_FOR_OPTION =

MY_F90_OPTION =

MY_C_OPTION =

MY_CPP_OPTION =

MY_LINK_OPTION =

PROGRAM = sl

LIB_OBJ =



# ################################################

# Do not forget to

# include $(INCLUDEPATH)/make.tail

# At tail of your makefile

# ################################################

# 文件结束







# 文件 make.tail

# 放在每个 makefile 文件最后

# ################################################



echo:

@echo $(F90_FILES)

@echo $(HOMEPATH)



# ################################################

# Create Dynamic Liberary

# ################################################

dyn_lib: $(LIB_OBJ)

$(DYN_LIB_CREATER) -o lib$(PROGRAM).so $(LIB_OBJ) +h lib$(PROGRAM).so

# ################################################

# Create Static Liberary

# ################################################

stc_lib: $(LIB_OBJ)

$(DYN_LIB_CREATER) -o lib$(PROGRAM).so $(LIB_OBJ)

# ################################################

# Copy Dynamic Liberary to LIBPATH

# Copy Fortran90 Module file to INCLUDEPATH

# ################################################

copy_lib:

mv lib$(PROGRAM).so $(LIBPATH)

copy_mod:

mv *.mod $(INCLUDEPATH)

# ################################################

# Clean Total project,Include Data file ,

# Object file , dynamic liberary ,

# static liberary , program

# ################################################

clean:

rm *.o *.mod *.plt *.so *.a $(PROGRAM)



# ################################################

# 缺省编译命令

# ################################################



.SUFFIXES: .f90 .c .for .f .cpp .cc .o



.f90.o:

$(F90_COMPLIER) $(F90_OPTION) $(MY_F90_OPTION) -c $<

.for.o:

$(FOR_COMPLIER) $(FOR_OPTION) $(MY_FOR_OPTION) -c $<

.f.o:

$(FOR_COMPLIER) $(FOR_OPTION) $(MY_FOR_OPTION) -c $<

.c.o:

$(C_COMPLIER) $(DEFINES) $(C_OPTION) $(MY_DEFINES) $(MY_C_OPTION) -c $<

.cc.o:

$(CPP_COMPLIER) $(DEFINES) $(CPP_OPTION) $(MY_DEFINES) $(MY_CPP_OPTION) -c $<

.cpp.o:

$(CPP_COMPLIER) $(DEFINES) $(CPP_OPTION) $(MY_DEFINES) $(MY_CPP_OPTION) -c $<



# ################################################

# 文件结束

# ################################################





然后,每个makefile如下:

HOMEPATH = $(HOME)



# ########################################################################



include $(HOMEPATH)/include/make.inc



# ########################################################################



MY_DEFINES =

MY_FOR_OPTION =

MY_F90_OPTION =

MY_C_OPTION =

MY_CPP_OPTION =

MY_LINK_OPTION =



# ########################################################################



LIB_OBJ =

PROGRAM = sl



# ########################################################################



LINKER = $(F90_COMPLIER)

LIB = $(LAPACK_LIB)



COMMONOBJ =

C_COMMONOBJ =

MOBJ = solve.o

C_OBJ = solve_c.o

CC_OBJ = solve_cc.o





all: program c_program cc_program

program: $(MOBJ)

$(LINKER) -L$(LIBPATH) $(LINK_OPTION) -o $(PROGRAM) \

$(MOBJ) $(COMMONOBJ) $(LIB)

c_program: $(C_OBJ)

$(C_COMPLIER) -L$(LIBPATH) $(LINK_OPTION) -o c_$(PROGRAM) \

$(C_OBJ) $(COMMONOBJ) $(LIB)

cc_program: $(CC_OBJ)

$(CPP_COMPLIER) -L$(LIBPATH) $(LINK_OPTION) -o C_$(PROGRAM) \

$(CC_OBJ) $(COMMONOBJ) $(LIB)





# ########################################################################



include $(INCLUDEPATH)/make.tail



# ########################################################################





希望对于不同的系统,只要修改make.inc和make.tail

摄氏<->华氏

摄氏->华氏: F=9/5*T+32.
华氏->摄氏: T=5/9*(F-32).