CFITSIO: a FITS library for fortran.
Last updated: Aug21,2020

The library CFITSIO by Bill Pence looked attractive to me, but after a week of sporadic questions to Bryan Irby at Goddard still can not seem to compile a program using the library. For archival purposes, I dump my notes below.

I should note that in the process of compleing these notes I heard some more from Bryan Irby and he got me fixed up. I can compile and run BP's testf77.f code. I'll look this code over and see what I can dig out from it.

 
This file: /home/sco/CFITSIO/README.cfitsio

I made the subdirectory where I want to install the library:
 % mkdir /home/sco/CFITSIO/cfitsioLIB

To make the library: 
 % cp /home/sco/Downloads/cfitsio-3.49.tar.gz .
 % tar xvzf cfitsio-3.49.tar.gz
 % cd cfitsio-3.49/
 % ./configure --prefix=/home/sco/CFITSIO/cfitsioLIB
 % make
 % make
 % make shared 
 % make install
 % make testprog 
    *** thta last step fails .........

Here is what I get: 
% ls /home/sco/CFITSIO/cfitsioLIB
include/  lib/
% ls /home/sco/CFITSIO/cfitsioLIB/lib
libcfitsio.a  libcfitsio.so@  libcfitsio.so.9@	libcfitsio.so.9.3.49*  pkgconfig/
% ls /home/sco/CFITSIO/cfitsioLIB/include/
drvrsmem.h  fitsio2.h  fitsio.h  longnam.h

The next thing to do is to see how I write a gfortan code to use this library. 

============================================
http://heasarc.gsfc.nasa.gov/cgi-bin/ftoolshelp 

Hello:
I have just downloaded cfitsio-3.49.tar.gz and installed the library 
but the test program does not seem to compile: 

The library seems to mmake and install properly: 
% /home/sco/CFITSIO/cfitsio-3.49 
% echo $LD_LIBRARY_PATH
/home/sco/CFITSIO/cfitsioLIB
% ls $LD_LIBRARY_PATH
include/  lib/

However, when I run the testprog: 
% make testprog 
**** Many line, but at the end I see: 
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1954: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1956: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1970: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1972: undefined reference to `curl_easy_perform'
collect2: error: ld returned 1 exit status
Makefile:147: recipe for target 'testprog' failed
make: *** [testprog] Error 1

Can you give me any advice on how to make this work? 

Thanks, 
Steve Odewahn      
============================================

Hi Bryan: 
 I deleted renamed the original tar dump and the do: 

 % tar xvzf cfitsio-3.49.tar.gz
 % cd cfitsio-3.49/
 % ./configure --prefix=/home/sco/CFITSIO/cfitsioLIB
 % make  >& make1.txt
 % make  >& make2.txt
 % make install  >& make3.txt
 % make testprog   >& make4.txt

cd /home/sco/CFITSIO/cfitsio-3.49


I attach the 44 make?.txt files. 

Thanks, 
Steve 


Tue Aug 18 11:05:00 CDT 2020
============================
New note from Bryan Irby:
Hi Steve,
I'm still puzzling over this, but I think it must have to do with the curl 
installation found by the CFITSIO configure: it appears to have chosen /
home/sco/anaconda2/bin/curl-config, and for some reason the libcurl provided 
by the output from that curl-config isn't behaving as expected.  I would 
expect to see that the output from 

$ ldd libcfitsio.so

shows a baked-in link to something like /home/sco/anaconda2/lib/libcurl.so, such 
that libcfitsio.so brings in libcurl.so and testprog doesn't have to resolve any 
curl symbols itself.  But it doesn't appear to be, so I'm confused.  If you have 
curl installed on your system (e.g. 'sudo apt-get -y install libcurl4 libcurl4-gnutls-dev'), 
you could try putting /usr/bin at the front of your path (ahead of the anaconda path) 
and then re-configure and re-build cfitsio to see if that fixes it.
Bryan
---
Bryan Irby (Innovim, LLC)
HEASARC Software
NASA/GSFC, Code 660.4
Greenbelt, Maryland 20771 USA
bryan.k.irby@nasa.gov

==================
Here are my efforts today. 

Do I have curl installed?       Answer: Yes. 
% which curl
/home/sco/anaconda2/bin/curl

If I put /usr/bin ahead of anaconda, do I get a differnet curl? 
% echo $PATH
/home/sco/binpub:/usr/bin:/home/sco/anaconda2/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/python:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/snap/bin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/home/sco/Installs/install_sco2019_20200305/bin/binc/morpho:.

% which curl
/home/sco/anaconda2/bin/curl        # I still "see" the same anaconda curl 

So, I install the curl that Bryan suggests: 
% sudo apt-get -y install libcurl4 libcurl4-gnutls-dev
% which curl
/home/sco/anaconda2/bin/curl
% csh .cshrc        
% rehash 

% echo $PATH
/home/sco/binpub:/usr/bin:/home/sco/anaconda2/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/python:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/snap/bin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/home/sco/Installs/install_sco2019_20200305/bin/binc/morpho:.

% which curl
/home/sco/anaconda2/bin/curl
 
So, I am always seeing the anaconda curl!!!  

% find / -name 'curl.h' -print  >&a1
/home/sco/anaconda2/pkgs/libcurl-7.64.0-h20c2e04_2/include/curl/curl.h
/home/sco/anaconda2/include/curl/curl.h
/usr/include/x86_64-linux-gnu/curl/curl.h

So, maybe I put /usr/include up front? 
% echo $PATH
/home/sco/binpub:/usr/bin:/usr/include:/home/sco/anaconda2/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/sbin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/python:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/snap/bin:/home/sco/Installs/install_sco2019_20200305/bin/bini:/home/sco/Installs/install_sco2019_20200305/bin/binc/otw:/home/sco/Installs/install_sco2019_20200305/bin/binc/morpho:.
% which curl
/home/sco/anaconda2/bin/curl

Fri Aug 21 10:42:10 CDT 2020
============================
I got a note from Bryan that seems to say I don;t really need curl installed, I 
need a library that curl uses. Presumamly this is whay he had the extra flags on 
the apt command: 
% sudo apt-get -y install libcurl4 libcurl4-gnutls-dev
After this, I tried the "make tesprog" and go the same errors about 
undefined references to clurl routines. 

Before I close the book on this, I clean all om subdirectories and start freh. 
I unpack the tar file and build a new destination subdirectory for the cfitsio 
library and give everything a try once again. 

  % pwd
  /home/sco/CFITSIO
  % ls
  cfitsio-3.49.tar.gz  S/
  % echo $PATH
    /home/sco/binpub:/usr/bin:/usr/include:/home/sco/anaconda2/bin:/bin:/usr/local/sbin:/usr/local/bin:....
  % sudo apt-get -y install libcurl4 libcurl4-gnutls-dev
  % mkdir /home/sco/CFITSIO/cfitsioLIB
  % ls
  cfitsio-3.49.tar.gz  cfitsioLIB/  S/
  % tar xvzf cfitsio-3.49.tar.gz
  % cd cfitsio-3.49/
  % ./configure --prefix=/home/sco/CFITSIO/cfitsioLIB
     
    Congratulations, Makefile update was successful.
    You may want to run "make" now.

  % make  >& make1.txt
  % make  >& make2.txt
  % make install  >& make3.txt
  % make testprog   >& make4.txt
  % tail make4.txt
    **** make4.txt doen NOT contain the error messages about 
         about curl! 
  % ls testprog
    testprog*

When I run it, there is a huge output, and then: 

Normally, there should be 8 error messages on the stack
all regarding 'numerical overflows':
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.
 Numerical overflow during type conversion while writing FITS data.

Status = 0: OK - no error

>>>> As far as I can tell, the lbrary is intsalled and the testprog 
     code runs correctly. 
======================================================

BUT, the testf77 code will not compile:


Hi Bryan:
One last thing, and then I'll give up. The next code that Bill Pence
gives is a fortran code name "testf77.f". I tyr to compile it, and I get
the same errors about curl!!!!  If you see a quick fix, I'll give a try. Here
is what I do:

% ls
makefile  testf77.f

% cat makefile
#
FC = gfortran
FFLAGS= -O -ffixed-line-length-none -fno-automatic
LIB0 = $(OTWLIB_DIR)/OTWLIB.a
LIB1 = /home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a
##
OBJS = \
 testf77.o
testf77: $(OBJS)
    $(FC) -o testf77 $(FFLAGS) $(OBJS) $(LIB0) $(LIB1) -L$(X11_DIR) -lX11

% make
gfortran  -o testf77 -O -ffixed-line-length-none -fno-automatic  testf77.o /home/sco/Installs/install_sco2019_20200305/codes/fortran/gfortran_compiler/libs/LIN/OTWLIB.a /home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a -L -lX11
/home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a(cfileio.o): In function `ffihtps':
/home/sco/CFITSIO/cfitsio-3.49/cfileio.c:7945: undefined reference to `curl_global_init'
/home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a(cfileio.o): In function `ffchtps':
/home/sco/CFITSIO/cfitsio-3.49/cfileio.c:7958: undefined reference to `curl_global_cleanup'
/home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a(drvrnet.o): In function `ssl_get_with_curl':
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1860: undefined reference to `curl_easy_init'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1862: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1869: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1871: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1872: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1874: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a(drvrnet.o):/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1878: more undefined references to `curl_easy_setopt' follow
/home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a(drvrnet.o): In function `ssl_get_with_curl':
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1918: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2056: undefined reference to `curl_easy_cleanup'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1892: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1893: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1894: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2017: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2018: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2025: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2026: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:2045: undefined reference to `curl_easy_cleanup'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1944: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1945: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1947: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1954: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1956: undefined reference to `curl_easy_perform'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1970: undefined reference to `curl_easy_setopt'
/home/sco/CFITSIO/cfitsio-3.49/drvrnet.c:1972: undefined reference to `curl_easy_perform'
collect2: error: ld returned 1 exit status
makefile:10: recipe for target 'testf77' failed
make: *** [testf77] Error 1

Maybe I have to refeernce a library for curl explicitly, but I have no idea how to
find that. May be a case of death by shared libraby.

Thanks,
Steve Odewahn 
 

--------------------------------------------
Answer from Bryan:


Hi Steve,
As I mentioned before, the shared libcfitsio (the .so) should pull in 
the libcurl dependency automatically, but if you use the static one 
(libcfitsio.a), you have to link with libcurl to resolve that dependency.  
So, you either need to add -lcurl to your link line (like you have 
with -lX11), or you should change "LIB1" to point to the shared 
libcfitsio.so instead.
Bryan


So I change my makefile to: 
% cat makefile
# 
FC = gfortran 
FFLAGS= -O -ffixed-line-length-none -fno-automatic 
LIB0 = $(OTWLIB_DIR)/OTWLIB.a 
LIB1 = /home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a
## 
OBJS = \
 testf77.o
testf77: $(OBJS)                             
	$(FC) -o testf77 $(FFLAGS) $(OBJS) $(LIB0) $(LIB1) -lcurl -L$(X11_DIR) -lX11 

% make
gfortran  -o testf77 -O -ffixed-line-length-none -fno-automatic  testf77.o /home/sco/Installs/install_sco2019_20200305/codes/fortran/gfortran_compiler/libs/LIN/OTWLIB.a  /home/sco/CFITSIO/cfitsioLIB/lib/libcfitsio.a -lcurl -L -lX11 
% ls
makefile  testf77*  testf77.f  testf77.o

Following the example of page 6 of Bill's pdf (% evince /home/sco/CFITSIO/S/cfitsio.pdf):
% cp ../cfitsio-3.49/testf77.out .
% ls
makefile  testf77*  testf77.f  testf77.o  testf77.out
% testf77 > testf77.lis

% wc -l testf77.lis
746 testf77.lis
% wc -l testf77.out
746 testf77.out


% date >a.1
% cp a.1 b.1
% diff a.1 b.1
***** So files the same produce no output

When I do this, I also get no output in the diff1 file. 
% diff testf77.lis testf77.out > diff1
**** Looks like testf77* runs properly. 

Hi Bryan:
Thanks a million for the super-fast reply. The "-lcurl" solution works and I
get a testf77 execuatble that runs and produces output that matched Bill's
file testf77.out.  Thanks very much for the help.
Cheers,
SteveO 





Back to SCO code page