1
votes

I am trying to build a very simple Makefile, that intends to use a homemade library (libf904QC.a) made of Fortran modules. The library is in /usr/local/lib64 whereas the corresponding .mod files are in /usr/local/include/f904QC

Here is the Makefile

# Makefile
NAME=NPManip
FFLAGS= -ffpe-trap=overflow -c -O3
LFLAGS= 
PATH2LIB=/usr/local/lib64/
INCLUDEDIR=/usr/local/include/f904QC/
#
LIB=-L$(PATH2LIB) -I$(INCLUDEDIR) -lf904QC.a
OBJS = \
tools_NPManip.o\
NPManip.o
%.o: %.f90
        gfortran $(LIB) $(FFLAGS) $*.f90

NPM:   $(OBJS)
        gfortran $(LFLAGS) $(OBJS) $(LIB) -o $(NAME)

clean:
        @if test -e $$HOME/bin/$(NAME); then \
        rm $$HOME/bin/$(NAME); \
        fi
        rm *.o *.mod

mrproper: clean
        rm $(NAME)

install:
        ln -s $(shell pwd)/$(NAME) $$HOME/bin/.

I get the following error message :

gfortran tools_NPManip.o NPManip.o -L/usr/local/lib64/ -I/usr/local/include/f904QC/ -lf904QC.a -o NPManip

/usr/lib64/gcc/x86_64-suse-linux/4.7/../../../../x86_64-suse-linux/bin/ld: cannot find -lf904QC.a

collect2: error: ld returned 1 exit status

make: * [NPM] Erreur 1

Where is the mistake? It is not obvious to me since libf904QC.o is actually located in /usr/local/lib64, which is defined by the -L option.

Thnak you for your help

1
Are you trying to link with the object libf904QC.o or the archive libf904QC.a? Try replacing -lf904QC.a with the full path to the object file.milancurcic

1 Answers

2
votes

You should specify either the full path to the library /usr/local/lib64/libf904QC.a or alternatively -L/usr/local/lib64 -lf90QC, without the .a in that case. From man ld:

   -l namespec
   --library=namespec
       Add the archive or object file specified by namespec to the list of files to link.  This option may be used any number of
       times.  If namespec is of the form :filename, ld will search the library path for a file called filename, otherwise it
       will search the library path for a file called libnamespec.a.

   -L searchdir
   --library-path=searchdir
       Add path searchdir to the list of paths that ld will search for archive libraries and ld control scripts.  You may use
       this option any number of times.  The directories are searched in the order in which they are specified on the command
       line.  Directories specified on the command line are searched before the default directories.  All -L options apply to
       all -l options, regardless of the order in which the options appear.  -L options do not affect how ld searches for a
       linker script unless -T option is specified.