我正在制作一个补丁集来编译dpkg
并 APT 到 Cygwin 上。我几乎一切正常,但我遇到了一些我无法解释的ar
奇怪行为。g++
APT 的库存 Makefile 使用一些奇特的包装来支持库的相当标准
.cc
→ .o
→ .a
流程,然后将其与主代码链接。它在 Linux 下运行得很好。然而,在 Cygwin 下,链接器阶段使用略有不同的命令,以我不理解的方式失败。
为什么会这样
g++ -g -O2 \ -L../构建/bin \ -o ../build/bin/apt \ ../build/obj/cmdline/apt.o \ ../build/obj/apt-pkg/*.o\ ←(这是不同的。) -lapt-私人-lbz2-liconv-lintl-llzma-lz
在我的系统上工作,但是
ar rcs ../build/bin/libapt-pkg.a ../build/obj/apt-pkg/*.o ←(这是不同的。) g++ -g -O2 \ -L../构建/bin \ -o ../build/bin/apt \ ../build/obj/cmdline/apt.o \ -lapt-pkg\ ←(这是不同的。) -lapt-私人-lbz2-liconv-lintl-llzma-lz
不是吗?当我运行第二个时,libapt-pkg.a
构建正常,但该g++
步骤会产生以下形式的错误:
$ 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()'
上面显示的两个命令序列在功能上不应该是等效的吗?有什么不同?