Hi.
I'm faced with a problem with the netrek build on OSX using gcc-4.0.1,
I'll try to outline it briefly, show error output, and show a minimal
example that reproduces the error.
Brief Outline:
Symbols defined in a .o file inserted into a .a file fail to be seen
by the linker at link time.
To Reproduced under OSX:
CFLAGS=-I/opt/local/include ./configure
make
End of error output looks like:
gcc -o message -I/opt/local/include -Wall -DRSA -I../include
message.o ../ntserv/libnetrek.a -lresolv -lm
gcc -I/opt/local/include -Wall -DRSA -I../include -c -o
newscores.o newscores.c
gcc -o newscores -I/opt/local/include -Wall -DRSA -I../include
newscores.o ../ntserv/libnetrek.a -lresolv -lm
/usr/bin/ld: Undefined symbols:
_Global
_PlayerFile
_status
_Access_File
_Banned_File
_Basep
_Bypass_File
_Cambot
_Cambot_out
_Clue_Bypass
_ConqFile
_Daemon
_Error_File
_Feature_File
_GodLog
_Inl
_LogFile
_LogFileName
_Mars
_MesgLog
_Motd_Path
_Newbie
_NoCount_File
_PlFile
_PlayerIndexFile
_PreT
_Prog
_Puck
_RSA_Key_File
_Robodir
_Robot
_Scores
_Scum_File
_SysDef_File
_Time_File
collect2: ld returned 1 exit status
make[1]: *** [newscores] Error 1
make: *** [do_utilities] Error 2
Minimal Test Case:
Copy attached makefile to an empty directory, and run 'make'
Expected output:
$ make
echo 'extern void bar(); int main (int argc, char**argv) { bar();
return 0; }' > three.c
gcc -c -o three.o three.c
echo "char foo[256];" > one.c
gcc -c -o one.o one.c
echo 'extern char foo[]; void bar() { strcpy(foo, "test"); }' > two.c
gcc -c -o two.o two.c
ar cru libfoo.a one.o two.o
gcc -o completed three.o libfoo.a
$ ./completed ; echo $?
0
Output found when using gcc-4.0.1 on OSX:
$ make
echo 'extern void bar(); int main (int argc, char**argv) { bar();
return 0; }' > three.c
gcc -c -o three.o three.c
echo "char foo[256];" > one.c
gcc -c -o one.o one.c
echo 'extern char foo[]; void bar() { strcpy(foo, "test"); }' > two.c
gcc -c -o two.o two.c
two.c: In function 'bar':
two.c:1: warning: incompatible implicit declaration of built-in
function 'strcpy'
ar cru libfoo.a one.o two.o
gcc -o completed three.o libfoo.a
/usr/bin/ld: Undefined symbols:
_foo
collect2: ld returned 1 exit status
make: *** [completed] Error 1
Ignoring the warning brought on by doing a strcpy without the relevent
header file, you see clearly the undefined symbol. Also note this is
the output of 'nm' in the error case:
$ nm libfoo.a
libfoo.a(one.o):
00000100 C _foo
libfoo.a(two.o):
00000000 T _bar
U _foo
--
Stephen Thorne
"Give me enough bandwidth and a place to sit and I will move the world."
--Jonathan Lange
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Makefile
Type: application/octet-stream
Size: 543 bytes
Desc: not available
Url : http://mailman.us.netrek.org/pipermail/netrek-dev/attachments/20060517/ccab5ae9/attachment.obj