Ok then, letās disclose some details to make easier to follow:
-
the incriminated procedure is called bracket
, and called in my test code as call bracket(ax,xx,bx,fa,fx,fb,func)
-
the library Iām including via pkg-config is called scifor
and the module that defines bracket
is called sf_optimize
Very similarly to what @kargl has shown if I inspect the include folder containing all the .mod
files of the scifor
library, I get
$ cat *.mod | gunzip | grep bracket
3735 'bracket' 'sf_optimize' '' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC
3733 'boltzmann_constant_in_inverse_meters_per_kelvin' 0 3734 'bracket'
50 'bracket' 'sf_optimize' '' 1 ((PROCEDURE UNKNOWN-INTENT MODULE-PROC
('bisect' 0 42 'bracket' 0 50 'brent' 0 59 'brentq' 0 66 'broyden1' 0 73
While if I use nm
to inspect the library file, I get
$ nm libscifor.a | grep bracket
000000000002bd60 T __sf_optimize_MOD_bracket
000000000001bbc0 T r8vec_bracket_
Finally if I inspect all the .o
files as correctly compiled with either the makefile or fpm build --flag "$(pkg-config --cflags scifor) $(pkg-config --libs scifor)"
I get
$ nm *.o | grep bracket
U bracket_
More specifically
$ nm src_optimize_cgfit_routines.f90.o | grep bracket
U bracket_
where optimize_cgfit_routines.90
is the source file for the modules that has calls to bracket
.
If I understand correctly what nm
is telling me here, my test code lacks a definition for the symbol bracket_
(why the underscore?), so at linking stage something has to be found elsewhere. The library file libscifor.a
has not a matching symbol, due to mangling (right?) so it should be coming from there. The included .mod
file for sf_optimize
does instead have a bracket
symbol indeed, so Iād expect it to be linked.
Crosscheck:
[gbellomi@login2 Test_CGfit]$ fpm build --flag "$(pkg-config --cflags scifor) $(pkg-config --libs scifor)"
minimize_krauth.f done.
optimize_cgfit_routines.f90 done.
minimize_sascha.f done.
VARS_GLOBAL.f90 done.
OPTIMIZATION.f90 done.
BATH_AUX.f90 done.
BATH_FIT.f90 done.
libCGfit.a done.
[100%] Project compiled successfully.
[gbellomi@login2 Test_CGfit]$ yes | fpm clean
Delete build, excluding dependencies (y/n)? + rm -rf build/gfortran_07A77609A9445D9C
[gbellomi@login2 Test_CGfit]$ fpm build --flag "$(pkg-config --libs scifor)"
minimize_krauth.f done.
optimize_cgfit_routines.f90 done.
minimize_sascha.f done.
VARS_GLOBAL.f90 failed.
[ 50%] Compiling...
././src/VARS_GLOBAL.f90:2:6:
USE SF_CONSTANTS, only: zero
1
Fatal Error: Cannot open module file āsf_constants.modā for reading at (1): No such file or directory
compilation terminated.
<ERROR> Compilation failed for object " src_VARS_GLOBAL.f90.o "
<ERROR>stopping due to failed compilation
STOP 1
[gbellomi@login2 Test_CGfit]$ yes | fpm clean
Delete build, excluding dependencies (y/n)? + rm -rf build/gfortran_FEBAE927C8C8AD11
[gbellomi@login2 Test_CGfit]$ fpm build --flag "$(pkg-config --cflags scifor)"
minimize_krauth.f done.
optimize_cgfit_routines.f90 done.
minimize_sascha.f done.
VARS_GLOBAL.f90 done.
OPTIMIZATION.f90 done.
BATH_AUX.f90 done.
BATH_FIT.f90 done.
libCGfit.a done.
[100%] Project compiled successfully.
-
if I do not pass the --cflags
pkg-config output to fpm I cannot compile anything, since my code uses some of the modules from scifor (unfortunately it errors before we can see if it would find bracket
or not)
-
if I skip instead the --libs
entry I get everything working (at least at build level), as much as it did by passing bothā¦ I believe this should be enough to prove that bracket
is found in the .mod
files, not in the library file(s).
To be clear, there is more than just libscifor.a
in the --libs
output, and I have not looked for the presence of bracket
inside the MKLs etc, but the above test should rule out them having any effect on this:
$ pkg-config --libs scifor
-lscifor -L/opt2/sissa/compiler/intel/2020.4/compilers_and_libraries_2020.4.304/linux/mkl/lib/intel64 -lmkl_gf_lp64 -lmkl_sequential -lmkl_core -L/usr/lib64 -lpthread -lm -ldl