gcc and linking problems?

Hugh Sasse hgs@dmu.ac.uk
Fri Sep 8 11:08:00 GMT 2006


I have some code which I have managed to compile with Suns cc on
Solaris9, sparc

cc: Sun WorkShop 6 update 2 C 5.3 Patch 111679-14 2004/02/20
ld: Software Generation Utilities - Solaris Link Editors: 5.9-1.375

but which I can't with GCC and gnu ld:

gcc (GCC) 4.1.0,  GNU ld version 2.16.1 or even ld 2.17.

I'm getting errors of the form:

fft_2d_filter.o: In function `fft_2d_forward':
fft_2d_filter.c:(.text+0x28): undefined reference to `fftw_plan_dft_r2c_2d'
fft_2d_filter.c:(.text+0x3c): undefined reference to `fftw_execute'

and

/usr/local/lib/gcc/sparc-sun-solaris2.9/4.1.0/../../../libpng.so: undefined reference to `deflate'

The first form (.text+0x<something>) I don't recall seeing before, 
though I've been using gcc since about 1990, and these functions are defined
in the headers.
The second one seems to be a linker problem, since it is complaining about
the library file itself.  Other programs seem to be working with PNG images
correctly, however.  

My Makefile which I using with GNU make 3.81 looks like this:
<quote>

CC = gcc
# CC = /progs/SUNWspro/bin/cc

# LD = /usr/ccs/bin/ld 
LD = /usr/local/bin/ld
# /usr/lib/ld.so /usr/lib/ld /usr/ucb/ld /usr/local/bin/ld
LIBS = -z verbose -z rescan -L$(LD_LIBRARY_PATH)  -lfftw3 -lm -ll -lz -lpng
# CFLAGS = -Wall -Wextra -I/usr/local/include -fPIC
CFLAGS = -I/usr/local/include 
# Our lexer may need to be flex later, but for now, we use lex.
LEX=/usr/ccs/bin/lex
# similarly, our YACC may need to be BISON. For now, use yacc.
YACC=/usr/local/bin/yacc -d


LD_LIBRARY_PATH=/progs/SUNWspro/lib:/usr/local/lib:/usr/local/lib/sparcv9:/usr/lib:/usr/share/lib:/usr/dt/lib:/usr/openwin/lib:/opt/panorama/lib:/opt/sfw/lib
LD_RUN_PATH=${LD_LIBRARY_PATH}



zipfile:	fsv.c fft_2d_filter.c fft_2d_filter.h 2d_input.l 2d_input.y
	zip fsv.zip fsv.c fft_2d_filter.c fft_2d_filter.h 2d_input.l 2d_input.y

fsv:	y.tab.o lex.yy.o fsv.o fft_2d_filter.o 
	$(CC) $(CFLAGS) $(LIBS) -o $@ fsv.o fft_2d_filter.o y.tab.o \
	lex.yy.o

.c.o:
	$(CC) $(CFLAGS) -c -o $@ $<

y.tab.c y.tab.h: 2d_input.y
	$(YACC) 2d_input.y

lex.yy.c: 2d_input.l
	$(LEX) $<


fsvclean:
	/bin/rm lex.yy.[cho] y.tab.[cho] fsv fft_2d_filter.o fsv.o 

</quote>

and the -z verbose -z rescan are actually Sun ld options, though GNU
ld doesn't choke on them.

I've tried using Google for these errors, with nothing seemingly
helpful showing up, and I'm wondering what docs specifically I
should be reading to understand why I get these failures?  Since
the Sun tools produce an executable, I think I can't be too far off
the true path.... 

        Thank you,
        Hugh



More information about the Gcc-help mailing list