提问人:Tony B 提问时间:11/14/2023 最后编辑:Tony B 更新时间:11/15/2023 访问量:79
尝试在 64 位计算机上构建 32 位应用程序时跳过不兼容的库
skipping incompatible library when trying to build 32 bit application on 64 bit machine
问:
我尝试在 64 位机器上将我的应用程序(使用 Makefile)制作为 32 位应用程序。由于消息和消息,链接阶段失败。skipping incompatible
cannot 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 位的东西。请注意,它找不到的东西就在那里,就在它说它正在搜索的地方,它只是出于某种原因不喜欢它们。-m32
file
file 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
答:
注意:OP 的操作系统不支持。这是预期的解决方案,但它不存在。:(也许下一个人可以从中受益。
看起来你正在以艰难的方式做到这一点。我希望修复您所有的库路径。CC=/usr/bin/i686-linux-gnu-gcc make
它的作用是设置为目标平台的编译器。CC
简化交叉编译的诀窍是将 $(CC) 用于每个调用,包括链接调用。这实际上有效,但 .s 文件除外(您通常不应该拥有)。
评论
/usr/bin
确保在链接命令和编译命令中。就我而言,链接行中缺少。 根据其中一条评论,真的帮助我找到了问题。-m32
-m32
make -Bn
评论
gcc -m32
objdump -a
clientMain.o
objdump -a
elf32-i386
objdump -a