From: John J. L. <jj...@po...> - 2002-06-16 21:55:22
|
Apologies for being stuck on such a silly thing: I can build a DLL statically linked to librecode (gcc is here invoked by a Python script to build a Python extension DLL, _swigrecode.pyd, hence the slightly odd command line): d:\ProgramFiles\mingw\bin\gcc.exe -mno-cygwin -mdll -static -s build\temp.win32-2.1\Release\recod e_wrap.o build\temp.win32-2.1\Release\_swigrecode.def -Lc:\Python21\libs -Lbuild\temp.win32-2.1 - lrecode -lglib-1.3 -liconv -lintl -lpython21 -lrecode -lbibtex -o build\lib.win32-2.1\_swigrecode .pyd And it links fine against build/temp.win32-2.1/librecode.a. OTOH, if I try and build a simple executable linked against the same library: $ cd compiled $ gcc -I../../recode/recode-3.6/src -L../build/temp.win32-2.1 -lrecode test.c C:\TEMP\ccbhaaaa.o(.text+0xa3):test.c: undefined reference to `recode_new_request' C:\TEMP\ccbhaaaa.o(.text+0xe9):test.c: undefined reference to `recode_scan_request' C:\TEMP\ccbhaaaa.o(.text+0x128):test.c: undefined reference to `recode_string' C:\TEMP\ccbhaaaa.o(.text+0x178):test.c: undefined reference to `recode_delete_request' C:\TEMP\ccbhaaaa.o(.text+0x195):test.c: undefined reference to `recode_new_outer' All of these functions are used by the swig extension (I can also compile a hand-written DLL that does the same thing -- this isn't a SWIG issue). $ nm ../build/temp.win32-2.1/librecode.a | grep recode_new_request 00001868 T _recode_new_request All of the symbols from recode are prefixed with a '_' in the static library. Why? John |
From: F. <j_r...@ya...> - 2002-06-17 00:26:45
|
On 2002.06.16 22:55 John J. Lee wrote: > Apologies for being stuck on such a silly thing: > > ... OTOH, if I > try and build a simple executable linked against the same library: > > $ cd compiled > $ gcc -I../../recode/recode-3.6/src -L../build/temp.win32-2.1 -lrecode > test.c > ... > > Why? > The order is mighty important! Try: $ gcc -I../../recode/recode-3.6/src -L../build/temp.win32-2.1 test.c -lrecode The ld linker is a single-pass linker (unless you specifically tell it to do several passes with the -( and -) flags). This means that when the linker loads a library (for example -lrecode), it will only load the symbols which are needed, i.e., the one missing in the previous objects. So the general thumb rule is put objects first and the libraries that don't depend of nothing in the last position, and in the middle put the libraries that depend on the last libraries and so on.. This is actually a FAQ. If it's not documented elsewhere it should be. José Fonseca |
From: John J. L. <jj...@po...> - 2002-06-19 21:37:18
|
On Sun, 16 Jun 2002, Jos=E9 Fonseca wrote: > On 2002.06.16 22:55 John J. Lee wrote: > > Apologies for being stuck on such a silly thing: [...] > > $ gcc -I../../recode/recode-3.6/src -L../build/temp.win32-2.1 -lrecode > > test.c [...] > The order is mighty important! Try: Argh! HOW many times have I done this?? I still don't understand why all the symbols in librecode.a begin with an underscore, though. What's the mangling for? Thanks John |