在编译时跳过不兼容的库
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.a
或libPI-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