44

当我尝试在本地机器上编译我的项目副本时,我收到一条错误消息,指出它正在跳过不兼容的库。当我在工作中使用托管在服务器上的实时版本时,情况并非如此[它在那里完美无缺]。

其他各种网站让我相信这可能是一个环境问题,因为我正在 Ubuntu 的 64 位发行版上开发,并且我假设服务器版本在 32 位上运行。尽管如此,在将我的环境变量设置为:

CFLAGS+=" -m32"
CXXFLAGS+=" -m32"

我仍然收到相同的编译错误:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

可以haz教程吗?

==编辑==

这是我遵循 Jonathan 的建议时收到的输出:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

显然,有问题的库毕竟是 32 位的?

4

2 回答 2

46

该消息实际上并不是一个错误——它只是一个警告,表明有问题的文件不是正确的架构(例如 32 位与 64 位,错误的 CPU 架构)。链接器将继续寻找正确类型的库。

当然,如果您也遇到类似的错误,can't find lPI-Http那么您就有问题了:-)

如果不了解构建系统和 makefile 的详细信息,很难提出确切的补救措施,但这里有一些在黑暗中的镜头:

  1. 只是为了检查:通常你会添加标志CFLAGS而不是 CTAGS- 你确定这是正确的吗?(您所拥有的可能是正确的 - 这将取决于您的构建系统!)
  2. 通常标志也需要传递给链接器 - 所以您可能还需要修改LDFLAGS

如果这没有帮助 - 您可以发布完整的错误输出,以及gcc foo.c -m32 -Dxxx正在执行的实际命令(例如等)吗?

于 2010-06-25T16:39:09.190 回答
16

通常,这本身不是错误。这是一个警告,它发现的第一个与-lPI-Http编译器/链接器的参数匹配的文件无效。当找不到具有正确内容的其他库时会发生错误。

因此,您需要查看/dvlpmnt/libPI-Http.a是 32 位目标文件库还是 64 位目标文件库 - 如果您使用该-m32选项进行编译,它可能是 64 位的。然后,您需要确定是否有其他 32 位的替代方案libPI-Http.a或文件。libPI-Http.so如果是这样,请确保包含它的目录列在-L/some/where链接器的参数中。如果没有,那么您将需要从某个地方获取或构建该库的 32 位版本。

要确定该库中的内容,您可能需要执行以下操作:

mkdir junk
cd junk
ar x /dvlpmnt/libPI-Http.a
file *.o
cd ..
rm -fr junk

' file' 步骤告诉您存档中的目标文件类型。其余的只是确保您不会弄脏不易清理的烂摊子。

于 2010-06-25T16:36:50.347 回答