I'm working a patch-set to compile
dpkg
and APT onto Cygwin. I've almost got everything working, but I'm encountering some weird behavior with ar
/g++
that I can't explain.
APT's stock Makefile uses some fancy wrapping around a pretty standard
.cc
→ .o
→ .a
flow for support libraries, which are then linked in with the main code. It works great under Linux. Under Cygwin, however, the linker stage, using slightly different commands, fails in a way that I don't understand.
Why is it that
g++ -g -O2 \ -L../build/bin \ -o ../build/bin/apt \ ../build/obj/cmdline/apt.o \ ../build/obj/apt-pkg/*.o \ ← (This is different.) -lapt-private -lbz2 -liconv -lintl -llzma -lzworks on my system, but
ar rcs ../build/bin/libapt-pkg.a ../build/obj/apt-pkg/*.o ← (This is different.) g++ -g -O2 \ -L../build/bin \ -o ../build/bin/apt \ ../build/obj/cmdline/apt.o \ -lapt-pkg \ ← (This is different.) -lapt-private -lbz2 -liconv -lintl -llzma -lzdoesn't? When I run the second one,
libapt-pkg.a
builds OK, but the g++
step produces errors of the form:
$ g++ -g -O2 -L../build/bin -o ../build/bin/apt ../build/obj/cmdline/apt.o -lapt-pkg -lapt-private -lbz2 -liconv -lintl -llzma -lz 2>&1 | head
../build/bin/libapt-private.a(private-upgrade.o): In function `CacheFile':
./apt/apt-private/../build/include/apt-private/private-cachefile.h:47: undefined reference to `pkgCacheFile::pkgCacheFile()'
./apt/apt-private/../build/include/apt-private/private-cachefile.h:47:(.text+0x1e): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `pkgCacheFile::pkgCacheFile()'
Shouldn't the two command sequences shown above be functionally equivalent? What's the difference?
Asked by Nicholas Clark
(332 rep)
Aug 3, 2015, 07:27 AM
Last activity: Aug 3, 2015, 09:55 PM
Last activity: Aug 3, 2015, 09:55 PM