Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Fortran library not rebuilding

Franco_B_1
Beginner
476 Views

Hi
I had a working set up consisting of a main program (F77) that calls a bunch of subroutines in a library. Suddenly, it appears that the library is not rebuilding - changes to the main program are implemented but those to a subroutine,“reader” in folder “util”, do not. The library builds without any errors and a new library archive is created via the following makefile (rewritten for easier reading):

FOR=ifort -c -O3
LINK=ifort
MY_DIR=/mydir
UTIL=$(MY_DIR)/util
(ditto many other subroutines)
.f.o:
    $(FOR) $<
.c.o:
    $(CC) $<
clean:
    rm -f *.o *~ core
libmy:
    rm libmy.a
    $(FOR) $(UTIL)/*.f  
   (ditto manyother subroutines)
    ar -rv $(MY_DIR)/libmy.a  *.o
    rm *.o

Then  the main program (and others) are compiled with another makefile. Again, there are no errors and a new executable is created.
FOR=ifort -c -O3 
LINK=ifort
MY_DIR=/mydir
LIBMY=-L$(MY_DIR) -lmy
.f.o:
    $(FOR) $(OPT) $<
.c.o:
    $(CC) $(OPT) $<
my_main.o: my_main.f
    $(FOR) my_main.f 
my_main: my_main.o
    $(LINK) -o my_main my_main.o  $(LIBMY)
    (ditto many other subroutines)

These makefiles used to work and have never changed, the only thing that has changed is the subroutine “reader”.

How can this be fixed?

 

0 Kudos
9 Replies
mecej4
Honored Contributor III
476 Views

What happened depends on the commands that you used to rebuild the library and the executable. Do you really need to use makefiles for a project with a few source files?

The default target in the first makefile is "clean", so just typing "make" will not rebuild the library. Similarly, in the second makefile the target my_main  is not listed as being dependent on the library libmy.a

0 Kudos
Franco_B_1
Beginner
476 Views

1. Not a few source files, over 200 of them.

2. I type "make mylib", which builds it.

3. $(LINK) -o my_main my_main.o  $(LIBMY) shows it being dependent on the library libmy.a. Is there another way to do this?

To simplify the question hugely, why does

ifort -c -O3 ~/mydir/reader.f
ar -rv ~/mydir/libmy.a reader.o

not add "reader" to the library, when it added all the other subroutines in the library?

0 Kudos
Steven_L_Intel1
Employee
476 Views

Can you show us the output of the ar command? 

0 Kudos
Franco_B_1
Beginner
476 Views

Sure:

franco@franco-VirtualBox:~/swifthjs$ make libswift
cp libswift.a libswift.a~
rm libswift.a
ifort -c -O3  /home/franco/swifthjs/anal/*.f  
ifort -c -O3  /home/franco/swifthjs/bs/*.f  
ifort -c -O3  /home/franco/swifthjs/coord/*.f  
ifort -c -O3  /home/franco/swifthjs/discard/*.f  
ifort -c -O3  /home/franco/swifthjs/hjs/*.f
ifort -c -O3  /home/franco/swifthjs/io/*.f  
ifort -c -O3  /home/franco/swifthjs/lyap/*.f  
ifort -c -O3  /home/franco/swifthjs/lyap2/*.f  
ifort -c -O3  /home/franco/swifthjs/mvs/drift/*.f  
ifort -c -O3  /home/franco/swifthjs/mvs/getacch/*.f  
ifort -c -O3  /home/franco/swifthjs/mvs/kickvh/*.f  
ifort -c -O3  /home/franco/swifthjs/mvs/step/*.f  
ifort -c -O3  /home/franco/swifthjs/orbel/*.f  
ifort -c -O3  /home/franco/swifthjs/rmvs/*.f  
ifort -c -O3  /home/franco/swifthjs/rmvs2/*.f  
ifort -c -O3  /home/franco/swifthjs/rmvs3/*.f  
ifort -c -O3  /home/franco/swifthjs/tu4/*.f  
ifort -c -O3  /home/franco/swifthjs/obl/*.f  
ifort -c -O3  /home/franco/swifthjs/util/*.f  
ifort -c -O3  /home/franco/swifthjs/symba5/*.f
ifort -c -O3  /home/franco/swifthjs/helio/*.f
ar -rv /home/franco/swifthjs/libswift.a  *.o
ar: creating /home/franco/swifthjs/libswift.a
a - anal_energy.o
a - anal_energy_discard5.o
a - anal_energy_hjs.o
a - anal_energy_mtiny.o
a - anal_energy_write.o
a - anal_energy_write_hjs.o
a - anal_jacobi.o
a - anal_jacobi_write.o
a - bs_der.o
[another 200 subroutines]
a - reader.o
rm *.o

0 Kudos
Steven_L_Intel1
Employee
476 Views

Well, that's not the command you showed originally. And I see reader.o in the output from ar. So what makes you think it isn't working?

0 Kudos
Franco_B_1
Beginner
476 Views

I changed the names in the original to make them more self-explanatory, but they are identical.

ar -rv $(MY_DIR)/libmy.a  *.o = ar -rv /home/franco/swifthjs/libswift.a  *.o

The command executes OK and the library appears to be built, in that its attributes change. However, its size does not, so it seems as if "reader" is not being incorporated. Running the main program produces results that do not reflect changes made in "reader". (Another oddity is that sometimes the main program does not compile, producing an error message "undefined reference to `reader_'".) 

What puzzles me is that all the other subroutines shown above have no problem. What is it about "reader" that makes it different? 

 

0 Kudos
Steven_L_Intel1
Employee
476 Views

In the original you explicitly named reader.o, but what you're really doing is wildcarding the object files.

If the library already contained reader then the use of -r would replace it. You can use the nm command to see what symbols are in the library.

Your mention that "sometimes" the program does not link (not "compile") suggests something else is going on - either it would always work or never work.

It reads to me as if there's an issue with your build environment, not the compiler. You should examine more closely what gets compiled, where the objects go, etc. Maybe ld has some way of showing where various symbols were resolved. Is there perhaps another object containing reader_?

0 Kudos
Franco_B_1
Beginner
476 Views

There was a previous version of "reader.f", saved under the completely different name "a.f", in the same directory as "reader.f". Deleting this file leads to the  "undefined reference to `reader_'" error. Renaming it to anything not ending in .f leads to this error as well.
I simply copied the contents of "reader.f" into "a.f", deleted the original "reader.f" and renamed "a.f" to "reader.f", after which everything worked.
So I found the solution, although I still do not know what the problem is! How the file "a.f" could have any influence when it is not referred to anywhere, remains a puzzle.

0 Kudos
Steven_L_Intel1
Employee
476 Views

If the .o was still there, it would get inserted in the library since you wildcarded it.

0 Kudos
Reply