尝试在 64 位计算机上构建 32 位应用程序时跳过不兼容的库

skipping incompatible library when trying to build 32 bit application on 64 bit machine

提问人:Tony B 提问时间:11/14/2023 最后编辑:Tony B 更新时间:11/15/2023 访问量:79

问:

我尝试在 64 位机器上将我的应用程序(使用 Makefile)制作为 32 位应用程序。由于消息和消息,链接阶段失败。skipping incompatiblecannot find -l<library>

  • 编程语言:C
  • LSB 版本:core-4.1-amd64:core-4.1-ia32:core-4.1-noarch
  • 操作系统:CentOS Linux release 7.6.1810 (Core)
  • GCC 版本:
gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • 安装了很多库,我相信我得到了所有 32 位版本。
  • GCC 上的 yum 信息:
sudo yum info gcc
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: download.cf.centos.org
 * epel: d2lzkl7pfhq30w.cloudfront.net
 * extras: download.cf.centos.org
 * updates: download.cf.centos.org
Installed Packages
Name        : gcc
Arch        : x86_64
Version     : 4.8.5
Release     : 44.el7
Size        : 37 M
Repo        : installed
From repo   : base
Summary     : Various compilers (C, C++, Objective-C, Java, ...)
URL         : http://gcc.gnu.org
License     : GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD
Description : The gcc package contains the GNU Compiler Collection version 4.8.
            : You'll need this package in order to compile C code.

以下是结果的子集:

/usr/bin/ld: skipping incompatible /home/<User>lib/odbc/3.0/libodbcifV3_10.so when searching for -lodbcifV3_10
/usr/bin/ld: cannot find -lodbcifV3_10
/usr/bin/ld: cannot find -lodbcbaseV3_28
/usr/bin/ld: cannot find -lodbcdV3_28
/usr/bin/ld: cannot find -lodbccV3_28
/usr/bin/ld: skipping incompatible /usr/local/easysoft/unixODBC/lib//libodbc.so when searching for -lodbc
/usr/lib/libaspell.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
make: *** [wmscentosdev2/webClient] Error 1
[<User>:v10_odbc:V3_28:mysql]> objdump -a /home/<User>lib/odbc/3.0/libodbcifV3_10.so 

/home/<User>lib/odbc/3.0/libodbcifV3_10.so:     file format elf32-i386
/home/<User>lib/odbc/3.0/libodbcifV3_10.so

[<User>:v10_odbc:V3_28:mysql]> objdump -a wmscentosdev2/clientMain.o                        

wmscentosdev2/clientMain.o:     file format elf32-i386
wmscentosdev2/clientMain.o

[<User>:v10_odbc:V3_28:mysql]> 

顺便说一句,忽略 aspell 问题,我想我需要重新编译那个,因为这是一个完全不同的问题。

我添加了,目标文件看起来不错,说它们是 386 个文件()。但是当它尝试链接文件时,它找不到各种共享库,给出“跳过不兼容”消息。当我查看共享库时,它们也是相同的文件格式。事实上,它们在我的生产机器上工作正常。我只是无法针对他们进行编译。我什至尝试添加,并且以某种方式链接器仍在查看 64 位的东西。请注意,它找不到的东西就在那里,就在它说它正在搜索的地方,它只是出于某种原因不喜欢它们。-m32filefile format elf32-386-march=i686-march=i386

我可以很好地编译静态库,因此编译阶段似乎有效。据我所知,生成的“.a”文件具有与上述相同的文件格式。

是的,我安装了开发库、静态库等。在 CentOS 上,我找不到这些库的 multilib 版本。我安装了 i686 变体。也许问题是这些库是在旧机器上使用 i386 变体编译的?这会导致问题吗?

最后,我做了一个简单的hello world应用程序,它编译得很好。

> objdump -a hello64

hello64:     file format elf64-x86-64
hello64

> objdump -a hello64

hello64:     file format elf64-x86-64
hello64

> hello64
Hello World!
> objdump -a hello32

hello32:     file format elf32-i386
hello32

> hello32
Hello World!

由于上述工作,我认为它在我的 makefile 中是笨拙的。它们非常复杂。否则我会把它们放在这里。我想在这种复杂性中埋藏的东西导致了一个问题,但我不能轻易地简化它来隔离问题。我怎样才能找出不匹配的地方?有没有办法告诉链接器更明确地说明错误在哪里?

顺便说一句,这些应用程序在较旧的 32 位系统上编译得很好,所以它不是应用程序本身。

我也许可以重新编译其中一些文件,但我无法重新编译所有文件 - 我没有一两个文件的源代码。so

对不起,如果我错过了一个明显的帖子。关于此类问题的帖子很多,大多数都提到了我已经尝试过的上述内容的一些变体。也许我只需要听到不同的解释。

添加对 GCC 的引用:

> ls -lrt /usr/bin/*gcc*
-rwxr-xr-x. 1 root root   2046 Jun 10  2014 /usr/bin/gccmakedep
-rwxr-xr-x. 1 root root  27088 Sep 29  2020 /usr/bin/gcc-ranlib
-rwxr-xr-x. 2 root root 768608 Sep 29  2020 /usr/bin/x86_64-redhat-linux-gcc
-rwxr-xr-x. 1 root root  27088 Sep 29  2020 /usr/bin/gcc-ar
-rwxr-xr-x. 2 root root 768608 Sep 29  2020 /usr/bin/gcc
-rwxr-xr-x. 1 root root  27088 Sep 29  2020 /usr/bin/gcc-nm

一部分命令由 make 运行,使用 运行。有 77 个对象,所以只需拉出其中一个编译,然后进行最终链接。日志文件长 911 行,运行 78 个不同的“cc”命令:make -Bn

... // Other CC commands for other C files
cc -c  -DMALLOC -DRDSJUL -DREPGEN -DSSLOPTB  -DPCKDAE -DWLM -DKAISER -DEAKEYS -DTRKFORMS -DTRKFORMS -g -DORACLE_DB_ACCESS -DODBC_DB_ACCESS -DORACLE_DB_LOG  -std=gnu99  -m32 -march=i386 -D_LINUX_SOURCE -D_POSIX_C_SOURCE=199506L -D_XOPEN_SOURCE=600 -D_GNU_SOURCE -Wall -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -nostdinc -I/usr/lib/gcc/i686-redhat-linux/4.4.4/include -I/usr/lib/gcc/i386-redhat-linux/4.1.1/include -I/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include -I/usr/include -pg -g -I. -I/home/wms/v10_odbc/std/lcn/issiobj/h -I/home/wms/v10_odbc/std/lcn/src/lib/base/h -I/home/wms/v10_odbc/std/lcn/src/lib/appl/h -I/home/wms/v10_odbc/std/lcn/src/lib/db/h -I/home/wms/v10_odbc/std/lcn/src/lib/feature/h -I/home/wms/v10_odbc/std/lcn/src/lib/interface -I/home/wms/v10_odbc/std/lcn/src/lib/sheet/h -I/home/wms/v10_odbc/std/lcn/src/h `pkg-config --cflags gtk+-2.0` -I/usr/local/include -I/usr/include/X11R6 -I/opt/glib/lib/glib/include -I/opt/glib/include -I/home/wms/v10_odbc/std/lcn/src/lib/interface/8.1.7/wmscentosdev2 -I/home/wms/v10_odbc/std/lcn/src/issi/interface/lib -I/home/wms/v10_odbc/std/lcn/src/issi/web/libwhmsxml -I/home/wms/v10_odbc/std/lcn/src/issi/inquiry/lib -I/home/wms/v10_odbc/std/lcn/src/issi/order_planning/lib -I/home/wms/v10_odbc/std/lcn/src/issi/frame/lib -I/home/wms/v10_odbc/std/lcn/src/issi/truck/h -I/home/wms/v10_odbc/std/lcn/src/issi/printer/lib `xml2-config --cflags` -DICSYN_NOAUTO clientMain.c -o wmscentosdev2/clientMain.o
... // Other CC commands for other C files
/bin/nice -3 cc wmscentosdev2/itemMessage.o wmscentosdev2/setup.o wmscentosdev2/forecastReview.o wmscentosdev2/user.o wmscentosdev2/webText.o wmscentosdev2/sysparam.o wmscentosdev2/reportxml.o wmscentosdev2/login.o wmscentosdev2/logActivity.o wmscentosdev2/spelling.o wmscentosdev2/reportReorderBySku.o wmscentosdev2/remotecancel.o wmscentosdev2/warehouseActivity.o wmscentosdev2/inquireDescription.o wmscentosdev2/heartBeat.o wmscentosdev2/timePhasedBuckets.o wmscentosdev2/util.o wmscentosdev2/salesOrderDetls.o wmscentosdev2/dispatch.o wmscentosdev2/approval.o wmscentosdev2/UploadCsv.o wmscentosdev2/ntfManagement.o wmscentosdev2/reportProcess.o wmscentosdev2/jasperReport.o wmscentosdev2/genericxml.o wmscentosdev2/supplierPortal.o wmscentosdev2/hostIntegration.o wmscentosdev2/eventTracking.o wmscentosdev2/rorManagement.o wmscentosdev2/mrpDashboard.o wmscentosdev2/reportUsage.o wmscentosdev2/warehouseManagement.o wmscentosdev2/reportUtils.o wmscentosdev2/columnOrderAdmin.o wmscentosdev2/reportOrderSku.o wmscentosdev2/inquire.o wmscentosdev2/manageInventory.o wmscentosdev2/consumption.o wmscentosdev2/reportOrderUser.o wmscentosdev2/cnsManagement.o wmscentosdev2/shopifyAdmin.o wmscentosdev2/question.o wmscentosdev2/reportShipments.o wmscentosdev2/message.o wmscentosdev2/wallet.o wmscentosdev2/remoteorder.o wmscentosdev2/clientMain.o wmscentosdev2/productionSchedTracker.o wmscentosdev2/passwordFetch.o wmscentosdev2/events.o wmscentosdev2/dropdown.o wmscentosdev2/permission.o wmscentosdev2/purchaseOrderDetls.o wmscentosdev2/reportReturns.o wmscentosdev2/reportInventory.o wmscentosdev2/roleAdmin.o wmscentosdev2/remotemsg.o wmscentosdev2/qryitl.o wmscentosdev2/shipmethod.o wmscentosdev2/reportReceiving.o wmscentosdev2/WCJobInq.o wmscentosdev2/order.o wmscentosdev2/limits.o wmscentosdev2/planManagement.o wmscentosdev2/orderQuery.o wmscentosdev2/kanbanAnalysis.o wmscentosdev2/receiptToHost.o wmscentosdev2/details.o wmscentosdev2/dashboard.o wmscentosdev2/reportShipmentsByLoc.o wmscentosdev2/kanbanDashboard.o wmscentosdev2/shipmentActivity.o wmscentosdev2/reportBackorder.o wmscentosdev2/orderInq.o wmscentosdev2/pupManagement.o wmscentosdev2/reportHistoryUsage.o wmscentosdev2/kanbanActivity.o    -L/home/wms/v10_odbc/lib/odbc/3.0 -lodbcifV3_10 -L/home/wms/v10_odbc/lib/odbc/3.0 -L/usr/local/easysoft/unixODBC/lib/ -lodbcbaseV3_28 -lodbcdV3_28 -lodbccV3_28 -lodbc  -pg -g /home/wms/v10_odbc/lib/libwhmsxml.a /usr/lib/libaspell.so /home/wms/v10_odbc/std/lcn/sys/svr/wmscentosdev2/libsvr.o /home/wms/v10_odbc/lib/libpnp.a /home/wms/v10_odbc/lib/libtcif.a /home/wms/v10_odbc/lib/libcms.a /home/wms/v10_odbc/lib/libtcs.a /home/wms/v10_odbc/lib/libframe.a /home/wms/v10_odbc/lib/libqry.a /home/wms/v10_odbc/lib/libfeature.a /home/wms/v10_odbc/lib/libdb.a /home/wms/v10_odbc/lib/libwhmsxml.a /home/wms/v10_odbc/lib/librecv.a /home/wms/v10_odbc/lib/libqry.a /home/wms/v10_odbc/lib/liborder.a  /home/wms/v10_odbc/lib/srclib.a /home/wms/v10_odbc/lib/libe3.a /home/wms/v10_odbc/lib/libisam.a /home/wms/v10_odbc/lib/librds.a  /home/wms/v10_odbc/lib/libwingui.a /home/wms/v10_odbc/lib/libFrmSSgui.a /home/wms/v10_odbc/lib/libsheetgui.a /home/wms/v10_odbc/lib/libFrmSSgui.a /home/wms/v10_odbc/lib/libfrmgui.a /home/wms/v10_odbc/lib/libint.a /home/wms/v10_odbc/lib/libreport.a  /home/wms/v10_odbc/lib/libdb.a /home/wms/v10_odbc/lib/libif.a /home/wms/v10_odbc/lib/libfeature.a  /home/wms/v10_odbc/lib/libdb.a /home/wms/v10_odbc/lib/liborder.a  /home/wms/v10_odbc/lib/srclib.a /home/wms/v10_odbc/lib/liblex.a /home/wms/v10_odbc/lib/liblpdriver.a /home/wms/v10_odbc/lib/libint.a /home/wms/v10_odbc/lib/libwhmsxml.a /home/wms/v10_odbc/lib/libdb.a /home/wms/v10_odbc/lib/liborder.a /home/wms/v10_odbc/lib/libreport.a /home/wms/v10_odbc/lib/libdevicegui.a /home/wms/v10_odbc/lib/libapl.a /home/wms/v10_odbc/lib/libinv.a /home/wms/v10_odbc/lib/libutl.a  /home/wms/v10_odbc/lib/libwingui.a /home/wms/v10_odbc/lib/libsheetgui.a /home/wms/v10_odbc/lib/libfrmgui.a /home/wms/v10_odbc/lib/libwingui.a /home/wms/v10_odbc/lib/libfeature.a  /home/wms/v10_odbc/lib/libgInter.a /home/wms/v10_odbc/lib/libapl.a /home/wms/v10_odbc/lib/liblex.a /home/wms/v10_odbc/lib/librds.a /home/wms/v10_odbc/lib/libutl.a /home/wms/v10_odbc/lib/srclib.a /home/wms/v10_odbc/lib/libscheduling.a  -lcurses `pkg-config --libs gtk+-2.0` /usr/lib/libssl.a /usr/lib/libcrypto.a /usr/lib/libz.a /usr/lib/libcrypt.a `xml2-config --libs` -lgsoap `curl-config --libs` `export PKG_CONFIG_PATH=/lib/pkgconfig;pkg-config --libs json-c` -lfreebl3 `xml2-config --libs` -o wmscentosdev2/webClient

有趣的是,我没有看到链接器阶段。所以也许这就是问题所在。-m32

c makefile centos7

评论

1赞 n. m. could be an AI 11/15/2023
显示您正在运行的编译和链接命令。为了获得最佳效果,它们都应以 开头。gcc -m32
0赞 Tony B 11/15/2023
这是一个非常复杂的 make 文件,有 77 个目标文件、许多库等。当我在目标文件和库上使用时,它们是 32 位的。我在上面举了一个例子,用 .objdump -aclientMain.o
0赞 n. m. could be an AI 11/15/2023
不要显示你的 Makefile,而是显示它运行的实际命令
0赞 Tony B 11/15/2023
我必须使用 makefile - 有很多链接。我会尽力为您提供您想要的东西,但我知道我正在编译 32 位对象 - 我检查的第一件事是所有对象,它们都有 .不过,让我看看我能做些什么。objdump -aelf32-i386
0赞 Tony B 11/15/2023
顺便说一句,随机的想法,会不会有些库最初是在 CentOS 6 32 位机器上编译的,而现在我在 CentOS 7 机器上?换句话说,即使它们都是 32 位对象(我在上面证明了这一点),也许它们是在不同的机器上构建的这一事实会混淆编译器或链接器?objdump -a

答:

0赞 Joshua 11/14/2023 #1

注意:OP 的操作系统不支持。这是预期的解决方案,但它不存在。:(也许下一个人可以从中受益。

看起来你正在以艰难的方式做到这一点。我希望修复您所有的库路径。CC=/usr/bin/i686-linux-gnu-gcc make

它的作用是设置为目标平台的编译器。CC

简化交叉编译的诀窍是将 $(CC) 用于每个调用,包括链接调用。这实际上有效,但 .s 文件除外(您通常不应该拥有)。

评论

0赞 Tony B 11/15/2023
中没有文件。在主帖子中添加了“gcc”列表。/usr/bin
0赞 Joshua 11/15/2023
@TonyB:在这种情况下,您应该安装 i686 的交叉编译包。这可能是实际问题,因为您缺少构建 i686 二进制文件的必要依赖项。
0赞 Tony B 11/15/2023
CentOS yum 没有给我这个选项。我会继续寻找。
1赞 Tony B 11/15/2023 #2

确保在链接命令和编译命令中。就我而言,链接行中缺少。 根据其中一条评论,真的帮助我找到了问题。-m32-m32make -Bn