在编译时跳过不兼容的库

Posted

技术标签:

【中文标题】在编译时跳过不兼容的库【英文标题】:Skipping Incompatible Libraries at compile 【发布时间】:2011-03-08 09:02:29 【问题描述】:

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

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

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

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

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

可以有教程吗?

==编辑==

这是我按照乔纳森的建议得到的输出:

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

显然,所讨论的库毕竟是 32 位的?

【问题讨论】:

那个库肯定是 32 位的吗?试试file /dvlpmnt/libPI-Http.a @Rup:这可能是说“当前的 ar 存档”,这并不是非常有用。如我的回答所示,您必须获取存档中的文件。 【参考方案1】:

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

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

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

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

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

【讨论】:

除此解决方案之外,您还可以将 -Wl,--no-warn-search-mismatch 添加到您的 CFLAGS 中,从而抑制这些警告。 有点为我工作,但我使用 LDFLAGS 而不是 CFLAGS。【参考方案2】:

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

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

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

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

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

【讨论】:

嗯,这很奇怪,这一步现在向我展示了所有有问题的库实际上都是 32 位的。 o__o @defaultstring:实际的链接命令行是什么?它是否包含-m32 标志?请在问题中将其添加为额外信息,而不是在此处作为额外评论。

以上是关于在编译时跳过不兼容的库的主要内容,如果未能解决你的问题,请参考以下文章

在搜索 -ldeepsort 时跳过不兼容的 ../tracker/libdeepsort.so

搜索 /lib/libpthread.so.0 时跳过不兼容的 /lib/libpthread.so.0

/usr/bin/ld: 搜索 -lQtCore 时跳过不兼容的 /usr/lib/x86_64-linux-gnu/libQtCore.so

跳过不兼容的 libpcap.so - 交叉编译

复制活动中的容错通过跳过不兼容的行

用 64 位 g++ Fedora 编译 32 位