Quantcast
Channel: Intel® Fortran Compiler
Viewing all articles
Browse latest Browse all 3270

Link Failure with Static Library

$
0
0

I made a minor refactoring change to a large code project and suddenly, BOOM, tons of link errors. After spending a lot of time trying to debug, I've concluded this is a linker/module problem. I think I've seen the problem discussed online years ago, but I couldn't find any good references.

With a simple, data-only module with no default initializers, linking on Mac OS X fails if the object file for the module is in a static library. Consider two separate source files:

module.f90:

module mod
implicit none

	real(8) :: array(1000)

contains

subroutine Init()
	array(:) = 0
end subroutine

end module

main.f90:

program main
use mod
	array(2) = 1
	print *, array(1:2)
end program

Compiling together works fine:

$ ifort module.f90 main.f90
$ ./a.out
  0.000000000000000E+000   1.00000000000000

Compiling and linking separately also works fine:

$ ifort -c module.f90 main.f90
$ ifort main.o module.o
$ ./a.out
  0.000000000000000E+000   1.00000000000000

But if the module is in a library, BOOM:

$ libtool -static -o libmod.a module.o
$ ifort main.o libmod.a
Undefined symbols for architecture x86_64:
  "_mod_mp_array_", referenced from:
      _MAIN__ in main.o
ld: symbol(s) not found for architecture x86_64

If the module is changed to have a default initializer, (i.e. real(8) :: array(1000) = 0) then linking through a static library works. Similarly, if the main routine is changed to call the module procedure Init(), then linking also works.

It appears that the system linker on Mac OS X ignores any static library objects that won't invoke executable code.

Is there a good way to guard against this problem in the future (other than remembering)?

 


Viewing all articles
Browse latest Browse all 3270